C# 串口接收數(shù)據中serialPort.close()死鎖的實例
最近在做一個有關高鐵模擬倉顯示系統(tǒng)的客戶端程序,在這個程序中要運用串口serialPort傳輸數(shù)據,因為每次接收數(shù)據結束后要更新UI界面,所以就用到了的Invoke,將更新UI的程序代碼封裝到一個方法中,然后通過Incoke調用,程序跑起來沒有任何問題,但是當你執(zhí)行serialPort.close()是程序就會發(fā)生死鎖,整個程序卡在那里動都動不了。
上網查了很多資料,有各種這樣的說法,有的說定義一個接收數(shù)據的標志,如果在執(zhí)行關閉程序是進行判斷,如果數(shù)據接收完了就關閉串口,沒有的話繼續(xù)執(zhí)行,但是經過親自測試并沒有什么卵用,最后自己研究invoke的時候發(fā)現(xiàn)還有Begininvoke,同時也發(fā)現(xiàn)了他們之間的不同,begininvoke用于后臺更新UI數(shù)據無需等待的情況,而invoke用于后臺更新UI數(shù)據無需要等待的情況,弄明白這兩個之間的不同之后才明白原來執(zhí)行serialPort.close()發(fā)生死鎖的原因就是invoke在作祟,改成begininvoke就不會出現(xiàn)死鎖問題。
直接上代碼:
SerialPort serialPort1 = new SerialPort(“COM5”, 115200, Parity.None, 8, StopBits.One); //初始化串口設置 //定義委托 public delegate void Displaydelegate(byte[] InputBuf); Byte[] OutputBuf = new Byte[8]; public Displaydelegate disp_delegate; //接收數(shù)據委托 disp_delegate = new Displaydelegate(DispUI); serialPort1.DataReceived += new SerialDataReceivedEventHandler(Comm_DataReceived); //串口讀取數(shù)據處理函數(shù) public void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { Byte[] InputBuf = new Byte[8]; try { serialPort1.Read(InputBuf, 0,6); //讀取緩沖區(qū)的數(shù)據,每次讀取6個字節(jié)的數(shù)據 System.Threading.Thread.Sleep(100); this.BeginInvoke(disp_delegate, InputBuf);//disp_delegate是定義的委托事件,在委托事件中調用修改UI的程序 } catch (TimeoutException ex) //超時處理 { MessageBox.Show(ex.ToString()); } } //更新UI界面 public void DispUI(byte[] InputBuf) { string str = System.Text.Encoding.Default.GetString(InputBuf); // Console.WriteLine(str); string strW = str.Substring(0, 2);//截取str的子串,從index=0開始截取長度為2的字符串 int OutStrW = int.Parse(strW); string strS = str.Substring(2, 2);//截取str的子串,從index=2開始截取長度為2的字符串 int OutStrS = int.Parse(strS); OutstrWen = (OutStrW - 4).ToString(); textBox8.Text = strW; textBox9.Text = (OutStrW - 4).ToString(); textBox10.Text = strS; textBox11.Text = (OutStrS - 10).ToString(); }
以上這篇C# 串口接收數(shù)據中serialPort.close()死鎖的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
CAD2008+VS2008開發(fā)ObjectARX加載失敗問題(推薦)
這篇文章主要介紹了CAD2008+VS2008開發(fā)ObjectARX加載失敗問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04Unity Shader實現(xiàn)圖形繪制(藍天白云大海)
這篇文章主要為大家詳細介紹了Unity Shader實現(xiàn)圖形繪制,藍天白云大海,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04Unity使用EzySlice實現(xiàn)模型多邊形順序切割
這篇文章主要為大家詳細介紹了Unity使用EzySlice實現(xiàn)模型多邊形順序切割,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07c#方法中調用參數(shù)的值傳遞方式和引用傳遞方式以及ref與out的區(qū)別深入解析
以下是對c#方法中調用參數(shù)的值傳遞方式和引用傳遞方式,以及ref與out的區(qū)進行了詳細的分析介紹,需要的朋友可以過來參考下2013-07-07C# 三種方式實現(xiàn)Socket數(shù)據接收
這篇文章主要給大家分享三種實現(xiàn)C# 實現(xiàn)Socket數(shù)據接收的方式,接下倆小編就來為大家詳細介紹吧,需要的朋友可以參考一下2021-10-10C#的Process類調用第三方插件實現(xiàn)PDF文件轉SWF文件
本篇文章主要介紹了C#的Process類調用第三方插件實現(xiàn)PDF文件轉SWF文件,現(xiàn)在分享給大家,具有一定的參考價值,有需要的可以了解一下。2016-11-11C#使用TreeView控件實現(xiàn)的二叉樹泛型節(jié)點類及其方法
TreeView?控件在?C#?中主要用于顯示分層結構的數(shù)據,這通常是一個文件系統(tǒng)的表示,但也可以是任何具有父子關系的數(shù)據集合,本文給大家介紹了C#使用TreeView控件實現(xiàn)的二叉樹泛型節(jié)點類及其方法,需要的朋友可以參考下2024-03-03