您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C#串口接收數據中serialPort.close()死鎖的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在做一個有關高鐵模擬倉顯示系統的客戶端程序,在這個程序中要運用串口serialPort傳輸數據,因為每次接收數據結束后要更新UI界面,所以就用到了的Invoke,將更新UI的程序代碼封裝到一個方法中,然后通過Incoke調用,程序跑起來沒有任何問題,但是當你執行serialPort.close()是程序就會發生死鎖,整個程序卡在那里動都動不了。
上網查了很多資料,有各種這樣的說法,有的說定義一個接收數據的標志,如果在執行關閉程序是進行判斷,如果數據接收完了就關閉串口,沒有的話繼續執行,但是經過親自測試并沒有什么卵用,最后自己研究invoke的時候發現還有Begininvoke,同時也發現了他們之間的不同,begininvoke用于后臺更新UI數據無需等待的情況,而invoke用于后臺更新UI數據無需要等待的情況,弄明白這兩個之間的不同之后才明白原來執行serialPort.close()發生死鎖的原因就是invoke在作祟,改成begininvoke就不會出現死鎖問題。
直接上代碼:
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; //接收數據委托 disp_delegate = new Displaydelegate(DispUI); serialPort1.DataReceived += new SerialDataReceivedEventHandler(Comm_DataReceived); //串口讀取數據處理函數 public void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { Byte[] InputBuf = new Byte[8]; try { serialPort1.Read(InputBuf, 0,6); //讀取緩沖區的數據,每次讀取6個字節的數據 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#串口接收數據中serialPort.close()死鎖的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。