基于Ymodem协议的IAP上位机(C#)
為了實(shí)現(xiàn)電腦與開(kāi)發(fā)板通過(guò)串口完成IAP功能,我用C#做了一個(gè)上位機(jī)軟件,通過(guò)這個(gè)軟件可以實(shí)現(xiàn)與單片機(jī)通信,使用Ymodem協(xié)議將新的應(yīng)用程序固件燒錄到單片機(jī)的flash中(單片機(jī)中的引導(dǎo)程序或應(yīng)用程序支持的情況下)。
上位機(jī)界面:
其中兩個(gè)ComboBox是分別用于選擇和顯示串口端口號(hào)和波特率的。
配置好正確的端口號(hào)和波特率,選擇要更新的固件。點(diǎn)擊開(kāi)始下載。就開(kāi)啟一個(gè)線程等待下位機(jī)發(fā)送傳輸請(qǐng)求。待收到下位機(jī)的請(qǐng)求后進(jìn)入文件傳送。
文件傳輸
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補(bǔ)齊if (fileReadCount != dataSize)for (int i = fileReadCount; i < dataSize; i++)data[i] = 0;/* calculate packetNumber */packetNumber++;//每發(fā)送完一個(gè)數(shù)據(jù)包,則累計(jì)if (packetNumber > 255)//最大允許發(fā)送255個(gè)數(shù)據(jù)包,即文件大小不得超過(guò)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);//計(jì)算當(dāng)前下載進(jìn)度 int progress = (int)(((float)dataSize * packetNumber) / fileStream.Length * 100); //將進(jìn)度以事件的形式通知給主線程 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)進(jìn)度事件
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;//更新進(jìn)度條 }總結(jié)
1.在子線程中不能操作非自身線程所創(chuàng)建的UI控件,所以在子線程完成UI交互的方式,使用事件的方式,通知?jiǎng)?chuàng)建UI控件的父線程。由父線程響應(yīng)事件來(lái)更新UI。
2.線程的傳參的形式可采用線程類的方式。把線程中調(diào)用的主方法和需要的參數(shù)寫在一個(gè)類里。再開(kāi)辟線程時(shí),對(duì)需要使用到的類中的成員變量進(jìn)行賦值。然后開(kāi)啟線程。
線程類的成員變量
開(kāi)啟子線程進(jìn)行通信
if (button.Text == "開(kāi)始下載") {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#)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 单片机检测220V交流电通断电路
- 下一篇: 网易云音乐歌词下载 C#