中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

一個簡單的串口程序

發布時間:2020-06-12 17:58:52 來源:網絡 閱讀:1022 作者:dawn0919 欄目:編程語言

····從2015年到現在,將近4年沒有寫程序了,這次是一個朋友要我做物聯網的項目,要學習一些新東西,做起來再說。

····基于STM32的通訊調試起來還是不方便,用C#寫了一個簡單的收發程序,先模擬鏈式收發,主要是測試流程是否正常無誤。后面用C寫好這部分處理程序再下載到單片機上就OK了,可能是剛開始接觸STM32的單片機不習慣,還是覺得這樣省事。

····在用C#寫的時候,發現關閉端口出現死機現象,到網上百度也沒有找到好的處理辦法,最終還是用委托注銷的方式解決了。

····主要代碼:

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

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

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

? ? ? ? ? ? ? ? ? ? ? ? //存入本地數據庫
? ? ? ? ? ? ? ? ? ? ? ? FFDWTable SaveFFDW = new FFDWTable();
? ? ? ? ? ? ? ? ? ? ? ? SaveFFDW.sCommType = "WS";
? ? ? ? ? ? ? ? ? ? ? ? SaveFFDW.sCommPara = "命令參數";
? ? ? ? ? ? ? ? ? ? ? ? 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];//創建接收字節數組
? ? ? ? ? ? ? ? ? ? ? ? sp.Read(ReceivedData, 0, ReceivedData.Length);//讀取接收的數據
? ? ? ? ? ? ? ? ? ? ? ? String ReceDataText = null;
? ? ? ? ? ? ? ? ? ? ? ? for (int i = 0; i < ReceivedData.Length - 1; i++)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ReceDataText += ("0x" + ReceivedData[i].ToString("X2" + " "));
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? textBox2.Text += ReceDataText;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? sp.DiscardInBuffer();//丟棄接收緩沖區數據

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }));

? ? ? ? }

····上面是接收事件,主要處理接收到的數據。

····在打開串口設置屬性的時候,要注冊事件:

? ? ? ? ? ? //定義DataReceived事件,當串口收到數據后觸發事件
? ? ? ? ? ?sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
····在關閉串口的時候,避免死機的方法:

? ? ? ? ? ? ? ? ? ? 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("關閉串口時發生錯誤!", "錯誤提示");
? ? ? ? ? ? ? ? ? ? }
  經過試驗,如果是BeginInvoke則不會死機,換成Invoke則死機,在網上查了資料,原來BeginInvoke是采用異步方式來處理里面的委托,而Invoke采用的是同步方式,它在處理完事務期間對其他消息有阻塞,所以造成了死機。
一個簡單的串口程序

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高阳县| 汽车| 云霄县| 霍城县| 安庆市| 城口县| 临夏市| 蕉岭县| 华坪县| 河南省| 米泉市| 北宁市| 晋州市| 武陟县| 丽水市| 镇巴县| 准格尔旗| 彭水| 石棉县| 延寿县| 柳州市| 措勤县| 公主岭市| 广河县| 黑河市| 勐海县| 麻阳| 肇东市| 金平| 岚皋县| 麻城市| 梧州市| 永康市| 吉首市| 蒲城县| 鹿泉市| 读书| 迁西县| 喀什市| 赞皇县| 宽甸|