您好,登錄后才能下訂單哦!
····從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采用的是同步方式,它在處理完事務期間對其他消息有阻塞,所以造成了死機。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。