基于Ymodem协议的IAP上位机(C#)
生活随笔
收集整理的這篇文章主要介紹了
基于Ymodem协议的IAP上位机(C#)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
為了實現(xiàn)電腦與開發(fā)板通過串口完成IAP功能,我用C#做了一個上位機軟件,通過這個軟件可以實現(xiàn)與單片機通信,使用Ymodem協(xié)議將新的應(yīng)用程序固件燒錄到單片機的flash中(單片機中的引導(dǎo)程序或應(yīng)用程序支持的情況下)。
上位機界面:
其中兩個ComboBox是分別用于選擇和顯示串口端口號和波特率的。
配置好正確的端口號和波特率,選擇要更新的固件。點擊開始下載。就開啟一個線程等待下位機發(fā)送傳輸請求。待收到下位機的請求后進入文件傳送。
文件傳輸
do { /* if this is the last packet fill the remaining bytes with 0 */fileReadCount = fileStream.Read(data, 0, dataSize);if (fileReadCount == 0) break;//最后讀取得字節(jié)數(shù)低于規(guī)定讀取的,則把發(fā)送的數(shù)據(jù)包用0補齊if (fileReadCount != dataSize)for (int i = fileReadCount; i < dataSize; i++)data[i] = 0;/* calculate packetNumber */packetNumber++;//每發(fā)送完一個數(shù)據(jù)包,則累計if (packetNumber > 255)//最大允許發(fā)送255個數(shù)據(jù)包,即文件大小不得超過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);//計算當(dāng)前下載進度 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);主線程響應(yīng)進度事件
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;//更新進度條 }總結(jié)
1.在子線程中不能操作非自身線程所創(chuàng)建的UI控件,所以在子線程完成UI交互的方式,使用事件的方式,通知創(chuàng)建UI控件的父線程。由父線程響應(yīng)事件來更新UI。
2.線程的傳參的形式可采用線程類的方式。把線程中調(diào)用的主方法和需要的參數(shù)寫在一個類里。再開辟線程時,對需要使用到的類中的成員變量進行賦值。然后開啟線程。
線程類的成員變量
開啟子線程進行通信
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(); }總結(jié)
以上是生活随笔為你收集整理的基于Ymodem协议的IAP上位机(C#)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片机检测220V交流电通断电路
- 下一篇: 广东阳西的小城生活