····從2015年到現(xiàn)在,將近4年沒有寫程序了,這次是一個朋友要我做物聯(lián)網(wǎng)的項目,要學(xué)習(xí)一些新東西,做起來再說。
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、呂梁網(wǎng)絡(luò)推廣、成都微信小程序、呂梁網(wǎng)絡(luò)營銷、呂梁企業(yè)策劃、呂梁品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供呂梁建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.chinadenli.net
····基于STM32的通訊調(diào)試起來還是不方便,用C#寫了一個簡單的收發(fā)程序,先模擬鏈式收發(fā),主要是測試流程是否正常無誤。后面用C寫好這部分處理程序再下載到單片機上就OK了,可能是剛開始接觸STM32的單片機不習(xí)慣,還是覺得這樣省事。
····在用C#寫的時候,發(fā)現(xiàn)關(guān)閉端口出現(xiàn)死機現(xiàn)象,到網(wǎng)上百度也沒有找到好的處理辦法,最終還是用委托注銷的方式解決了。
····主要代碼:
? ? ? ? private void sp_DataReceived(object sender,SerialDataReceivedEventArgs e)
? ? ? ? {
? ? ? ? ? ? System.Threading.Thread.Sleep(500);//延時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();
? ? ? ? ? ? ? ? ? ? ? ? //存入本地數(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è)置屬性的時候,要注冊事件:
? ? ? ? ? ? //定義DataReceived事件,當串口收到數(shù)據(jù)后觸發(fā)事件
? ? ? ? ? ?sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
····在關(guān)閉串口的時候,避免死機的方法:
? ? ? ? ? ? ? ? ? ? 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)閉串口時發(fā)生錯誤!", "錯誤提示");
? ? ? ? ? ? ? ? ? ? }
經(jīng)過試驗,如果是BeginInvoke則不會死機,換成Invoke則死機,在網(wǎng)上查了資料,原來BeginInvoke是采用異步方式來處理里面的委托,而Invoke采用的是同步方式,它在處理完事務(wù)期間對其他消息有阻塞,所以造成了死機。
分享文章:一個簡單的串口程序
標題網(wǎng)址:http://www.chinadenli.net/article4/jcosoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、商城網(wǎng)站、標簽優(yōu)化、ChatGPT、網(wǎng)頁設(shè)計公司、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)