溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

一個(gè)簡單的串口程序

發(fā)布時(shí)間:2020-06-12 17:58:52 來源:網(wǎng)絡(luò) 閱讀:1017 作者:dawn0919 欄目:編程語言

····從2015年到現(xiàn)在,將近4年沒有寫程序了,這次是一個(gè)朋友要我做物聯(lián)網(wǎng)的項(xiàng)目,要學(xué)習(xí)一些新東西,做起來再說。

····基于STM32的通訊調(diào)試起來還是不方便,用C#寫了一個(gè)簡單的收發(fā)程序,先模擬鏈?zhǔn)绞瞻l(fā),主要是測(cè)試流程是否正常無誤。后面用C寫好這部分處理程序再下載到單片機(jī)上就OK了,可能是剛開始接觸STM32的單片機(jī)不習(xí)慣,還是覺得這樣省事。

····在用C#寫的時(shí)候,發(fā)現(xiàn)關(guān)閉端口出現(xiàn)死機(jī)現(xiàn)象,到網(wǎng)上百度也沒有找到好的處理辦法,最終還是用委托注銷的方式解決了。

····主要代碼:

? ? ? ? private void sp_DataReceived(object sender,SerialDataReceivedEventArgs e)
? ? ? ? {

? ? ? ? ? ? System.Threading.Thread.Sleep(500);//延時(shí)500ms等待接收完數(shù)據(jù)
? ? ? ? ? ? Application.DoEvents();
? ? ? ? ? ? this.BeginInvoke((EventHandler)(delegate
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (IsOpen)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? textBox2.Text += "\r\n新接收到的數(shù)據(jù):"+Convert.ToString(DateTime.Now);
? ? ? ? ? ? ? ? ? ? if (IsFormatHex == false)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? byte[] ReceiveData = new byte[sp.BytesToRead];//創(chuàng)建接收字節(jié)數(shù)組
? ? ? ? ? ? ? ? ? ? ? ? sp.Read(ReceiveData, 0, ReceiveData.Length);//讀取接收到的數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? ? ? receiveDatas.Clear();
? ? ? ? ? ? ? ? ? ? ? ? receiveDatas.AddRange(ReceiveData);

? ? ? ? ? ? ? ? ? ? ? ? textBox2.Text += Encoding.Default.GetString(receiveDatas.ToArray());
? ? ? ? ? ? ? ? ? ? ? ? //textBox2.Text += sp.ReadLine().ToString();

? ? ? ? ? ? ? ? ? ? ? ? //存入本地?cái)?shù)據(jù)庫
? ? ? ? ? ? ? ? ? ? ? ? FFDWTable SaveFFDW = new FFDWTable();
? ? ? ? ? ? ? ? ? ? ? ? SaveFFDW.sCommType = "WS";
? ? ? ? ? ? ? ? ? ? ? ? SaveFFDW.sCommPara = "命令參數(shù)";
? ? ? ? ? ? ? ? ? ? ? ? SaveFFDW.sSend = "01";
? ? ? ? ? ? ? ? ? ? ? ? SaveFFDW.dtSendTime = DateTime.Now;
? ? ? ? ? ? ? ? ? ? ? ? SaveFFDW.sRece = "02";
? ? ? ? ? ? ? ? ? ? ? ? SaveFFDW.sData = Encoding.Default.GetString(receiveDatas.ToArray());
? ? ? ? ? ? ? ? ? ? ? ? //SaveData(SaveFFDW);
? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? Byte[] ReceivedData = new Byte[sp.BytesToRead];//創(chuàng)建接收字節(jié)數(shù)組
? ? ? ? ? ? ? ? ? ? ? ? sp.Read(ReceivedData, 0, ReceivedData.Length);//讀取接收的數(shù)據(jù)
? ? ? ? ? ? ? ? ? ? ? ? String ReceDataText = null;
? ? ? ? ? ? ? ? ? ? ? ? for (int i = 0; i < ReceivedData.Length - 1; i++)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ReceDataText += ("0x" + ReceivedData[i].ToString("X2" + " "));
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? textBox2.Text += ReceDataText;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? sp.DiscardInBuffer();//丟棄接收緩沖區(qū)數(shù)據(jù)

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }));

? ? ? ? }

····上面是接收事件,主要處理接收到的數(shù)據(jù)。

····在打開串口設(shè)置屬性的時(shí)候,要注冊(cè)事件:

? ? ? ? ? ? //定義DataReceived事件,當(dāng)串口收到數(shù)據(jù)后觸發(fā)事件
? ? ? ? ? ?sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
····在關(guān)閉串口的時(shí)候,避免死機(jī)的方法:

? ? ? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? // 消除委托
? ? ? ? ? ? ? ? ? ? ? ? if (IsOpen == false)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? sp.DataReceived -= sp_DataReceived;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? sp.Close();
? ? ? ? ? ? ? ? ? ? ? ? IsSetProperty = false;
? ? ? ? ? ? ? ? ? ? ? ? btOpenComPort.Text = "打開串口";
? ? ? ? ? ? ? ? ? ? ? ? CBCommPort.Enabled = true;
? ? ? ? ? ? ? ? ? ? ? ? CBBaudRate.Enabled = true;
? ? ? ? ? ? ? ? ? ? ? ? CBDataBit.Enabled = true;
? ? ? ? ? ? ? ? ? ? ? ? CBParitv.Enabled = true;
? ? ? ? ? ? ? ? ? ? ? ? CBStopBit.Enabled = true;
? ? ? ? ? ? ? ? ? ? ? ? rbChar.Enabled = true;
? ? ? ? ? ? ? ? ? ? ? ? rbHex.Enabled = true;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? catch (Exception)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? MessageBox.Show("關(guān)閉串口時(shí)發(fā)生錯(cuò)誤!", "錯(cuò)誤提示");
? ? ? ? ? ? ? ? ? ? }
  經(jīng)過試驗(yàn),如果是BeginInvoke則不會(huì)死機(jī),換成Invoke則死機(jī),在網(wǎng)上查了資料,原來BeginInvoke是采用異步方式來處理里面的委托,而Invoke采用的是同步方式,它在處理完事務(wù)期間對(duì)其他消息有阻塞,所以造成了死機(jī)。
一個(gè)簡單的串口程序

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI