C# 串口接收數(shù)據(jù)中serialPort.close()死鎖的實(shí)例
最近在做一個(gè)有關(guān)高鐵模擬倉顯示系統(tǒng)的客戶端程序,在這個(gè)程序中要運(yùn)用串口serialPort傳輸數(shù)據(jù),因?yàn)槊看谓邮諗?shù)據(jù)結(jié)束后要更新UI界面,所以就用到了的Invoke,將更新UI的程序代碼封裝到一個(gè)方法中,然后通過Incoke調(diào)用,程序跑起來沒有任何問題,但是當(dāng)你執(zhí)行serialPort.close()是程序就會發(fā)生死鎖,整個(gè)程序卡在那里動都動不了。
上網(wǎng)查了很多資料,有各種這樣的說法,有的說定義一個(gè)接收數(shù)據(jù)的標(biāo)志,如果在執(zhí)行關(guān)閉程序是進(jìn)行判斷,如果數(shù)據(jù)接收完了就關(guān)閉串口,沒有的話繼續(xù)執(zhí)行,但是經(jīng)過親自測試并沒有什么卵用,最后自己研究invoke的時(shí)候發(fā)現(xiàn)還有Begininvoke,同時(shí)也發(fā)現(xiàn)了他們之間的不同,begininvoke用于后臺更新UI數(shù)據(jù)無需等待的情況,而invoke用于后臺更新UI數(shù)據(jù)無需要等待的情況,弄明白這兩個(gè)之間的不同之后才明白原來執(zhí)行serialPort.close()發(fā)生死鎖的原因就是invoke在作祟,改成begininvoke就不會出現(xiàn)死鎖問題。
直接上代碼:
SerialPort serialPort1 = new SerialPort(“COM5”, 115200, Parity.None, 8, StopBits.One); //初始化串口設(shè)置
//定義委托
public delegate void Displaydelegate(byte[] InputBuf);
Byte[] OutputBuf = new Byte[8];
public Displaydelegate disp_delegate;
//接收數(shù)據(jù)委托
disp_delegate = new Displaydelegate(DispUI);
serialPort1.DataReceived += new SerialDataReceivedEventHandler(Comm_DataReceived);
//串口讀取數(shù)據(jù)處理函數(shù)
public void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Byte[] InputBuf = new Byte[8];
try
{
serialPort1.Read(InputBuf, 0,6); //讀取緩沖區(qū)的數(shù)據(jù),每次讀取6個(gè)字節(jié)的數(shù)據(jù)
System.Threading.Thread.Sleep(100);
this.BeginInvoke(disp_delegate, InputBuf);//disp_delegate是定義的委托事件,在委托事件中調(diào)用修改UI的程序
}
catch (TimeoutException ex) //超時(shí)處理
{
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ù)據(jù)中serialPort.close()死鎖的實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
時(shí)間戳與時(shí)間相互轉(zhuǎn)換(php .net精確到毫秒)
本文給大家分享的時(shí)間戳與時(shí)間相互轉(zhuǎn)換(php .net精確到毫秒) ,感興趣的朋友一起學(xué)習(xí)吧2015-09-09
通過?C#/VB.NET?代碼將?Excel?工作表拆分為單獨(dú)的文件
這篇文章主要介紹了通過C#/VB.NET代碼將Excel工作表拆分為單獨(dú)的文件,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
C#利用TreeView控件實(shí)現(xiàn)目錄跳轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了C#潤滑利用TreeView控件實(shí)現(xiàn)目錄跳轉(zhuǎn)功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手嘗試一下2022-07-07
C# WinForm創(chuàng)建Excel文件的實(shí)例
下面小編就為大家?guī)硪黄狢# WinForm創(chuàng)建Excel文件的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
C#(asp.net)多線程用法示例(可用于同時(shí)處理多個(gè)任務(wù))
這篇文章主要介紹了C#(asp.net)多線程Thread用法,可用于同時(shí)處理多個(gè)任務(wù),以簡單數(shù)學(xué)運(yùn)算為例講述了Thread類實(shí)現(xiàn)多線程的相關(guān)技巧,需要的朋友可以參考下2016-06-06
C#使用Post調(diào)用接口并傳遞json參數(shù)
這篇文章主要介紹了C#使用Post調(diào)用接口并傳遞json參數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。2022-06-06

