基于Ymodem协议的IAP上位机(C#)
生活随笔
收集整理的這篇文章主要介紹了
基于Ymodem协议的IAP上位机(C#)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了實現電腦與開發板通過串口完成IAP功能,我用C#做了一個上位機軟件,通過這個軟件可以實現與單片機通信,使用Ymodem協議將新的應用程序固件燒錄到單片機的flash中(單片機中的引導程序或應用程序支持的情況下)。
上位機界面:
其中兩個ComboBox是分別用于選擇和顯示串口端口號和波特率的。
配置好正確的端口號和波特率,選擇要更新的固件。點擊開始下載。就開啟一個線程等待下位機發送傳輸請求。待收到下位機的請求后進入文件傳送。
文件傳輸
do { /* if this is the last packet fill the remaining bytes with 0 */fileReadCount = fileStream.Read(data, 0, dataSize);if (fileReadCount == 0) break;//最后讀取得字節數低于規定讀取的,則把發送的數據包用0補齊if (fileReadCount != dataSize)for (int i = fileReadCount; i < dataSize; i++)data[i] = 0;/* calculate packetNumber */packetNumber++;//每發送完一個數據包,則累計if (packetNumber > 255)//最大允許發送255個數據包,即文件大小不得超過255K.packetNumber -= 256;Console.WriteLine(packetNumber);/* calculate invertedPacketNumber */invertedPacketNumber = 255 - packetNumber;/* calculate CRC */Crc16Ccitt crc16Ccitt = new Crc16Ccitt(InitialCrcValue.Zeros);CRC = crc16Ccitt.ComputeChecksumBytes(data);/* send the packet */sendYmodemPacket(STX, packetNumber, invertedPacketNumber, data, dataSize, CRC, crcSize);//計算當前下載進度 int progress = (int)(((float)dataSize * packetNumber) / fileStream.Length * 100); //將進度以事件的形式通知給主線程 NowDownloadProgressEvent.Invoke(progress, new EventArgs());/* wait for ACK */if (serialPort.ReadByte() != ACK){Debug.WriteLine("Couldn't send a packet.");DownloadResultEvent.Invoke(false, new EventArgs());return;// false;} } while (dataSize == fileReadCount);主線程響應進度事件
private delegate void NowDownloadProgress(int nowValue);private void NowDownloadProgressEvent(object sender, EventArgs e) {int value = Convert.ToInt32(sender);NowDownloadProgress count = new NowDownloadProgress(UploadFileProgress);this.Invoke(count, value);} private void UploadFileProgress(int count) {DownloadProgressBar.Value = count;//更新進度條 }總結
1.在子線程中不能操作非自身線程所創建的UI控件,所以在子線程完成UI交互的方式,使用事件的方式,通知創建UI控件的父線程。由父線程響應事件來更新UI。
2.線程的傳參的形式可采用線程類的方式。把線程中調用的主方法和需要的參數寫在一個類里。再開辟線程時,對需要使用到的類中的成員變量進行賦值。然后開啟線程。
線程類的成員變量
開啟子線程進行通信
if (button.Text == "開始下載") {button.Text = "正在下載";ymodem = new Ymodem.Ymodem();ymodem.Path = pathTextBox.Text.ToString();ymodem.PortName = SerialPortComboBox.SelectedItem.ToString();ymodem.BaudRate = Convert.ToInt32(BaudRateComboBox.SelectedItem.ToString());downloadThread = new System.Threading.Thread(ymodem.YmodemUploadFile);ymodem.NowDownloadProgressEvent += new EventHandler(NowDownloadProgressEvent);ymodem.DownloadResultEvent += new EventHandler(DownloadFinishEvent);downloadThread.Start(); }總結
以上是生活随笔為你收集整理的基于Ymodem协议的IAP上位机(C#)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片机检测220V交流电通断电路
- 下一篇: 网易云音乐歌词下载 C#