日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

基于Ymodem协议的IAP上位机(C#)

發(fā)布時(shí)間:2023/12/20 C# 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Ymodem协议的IAP上位机(C#) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為了實(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)入文件傳送。

if (serialPort.ReadByte() != C)//下位機(jī)沒(méi)有請(qǐng)求傳送文件。則 {//通知主線程。更新固件失敗Debug.WriteLine("Can't begin the transfer.");DownloadResultEvent.Invoke(false, new EventArgs());serialPort.Close(); } //收到下位機(jī)請(qǐng)求后發(fā)送第一個(gè)初始化包,告知下位機(jī),傳輸文件的文件名和大小 sendYmodemInitialPacket(STX, packetNumber, invertedPacketNumber, data, dataSize, path, fileStream, CRC, crcSize); //等待下位機(jī)發(fā)送應(yīng)答信號(hào) //超過(guò)串口組件規(guī)定的接收時(shí)間沒(méi)有收到應(yīng)答,則表示更新失敗 if (serialPort.ReadByte() != ACK) {Debug.WriteLine("Can't send the initial packet.");DownloadResultEvent.Invoke(false, new EventArgs());// return false; } if (serialPort.ReadByte() != C)//接收到'C'下位機(jī)請(qǐng)求則表示下位機(jī)請(qǐng)求進(jìn)入正式的文件數(shù)據(jù)傳輸流程{DownloadResultEvent.Invoke(false, new EventArgs());return;// false;}

文件傳輸

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)啟線程。
線程類的成員變量

private string path; public string Path{get {return Path;} set { path = value; } } private string portName; public string PortName { get { return portName; } set { portName = value; } } private int baudRate; public int BaudRate { get { return baudRate; } set { baudRate = value; } } private System.IO.Ports.SerialPort serialPort = new System.IO.Ports.SerialPort(); public event EventHandler NowDownloadProgressEvent; public event EventHandler DownloadResultEvent;

開(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。