這篇文章將為大家詳細(xì)講解有關(guān)C#串口接收數(shù)據(jù)中serialPort.close()死鎖的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到南州晴隆網(wǎng)站設(shè)計(jì)與南州晴隆網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋南州晴隆地區(qū)。
在做一個(gè)有關(guān)高鐵模擬倉(cāng)顯示系統(tǒng)的客戶端程序,在這個(gè)程序中要運(yùn)用串口serialPort傳輸數(shù)據(jù),因?yàn)槊看谓邮諗?shù)據(jù)結(jié)束后要更新UI界面,所以就用到了的Invoke,將更新UI的程序代碼封裝到一個(gè)方法中,然后通過(guò)Incoke調(diào)用,程序跑起來(lái)沒(méi)有任何問(wèn)題,但是當(dāng)你執(zhí)行serialPort.close()是程序就會(huì)發(fā)生死鎖,整個(gè)程序卡在那里動(dòng)都動(dòng)不了。
上網(wǎng)查了很多資料,有各種這樣的說(shuō)法,有的說(shuō)定義一個(gè)接收數(shù)據(jù)的標(biāo)志,如果在執(zhí)行關(guān)閉程序是進(jìn)行判斷,如果數(shù)據(jù)接收完了就關(guān)閉串口,沒(méi)有的話繼續(xù)執(zhí)行,但是經(jīng)過(guò)親自測(cè)試并沒(méi)有什么卵用,最后自己研究invoke的時(shí)候發(fā)現(xiàn)還有Begininvoke,同時(shí)也發(fā)現(xiàn)了他們之間的不同,begininvoke用于后臺(tái)更新UI數(shù)據(jù)無(wú)需等待的情況,而invoke用于后臺(tái)更新UI數(shù)據(jù)無(wú)需要等待的情況,弄明白這兩個(gè)之間的不同之后才明白原來(lái)執(zhí)行serialPort.close()發(fā)生死鎖的原因就是invoke在作祟,改成begininvoke就不會(huì)出現(xiàn)死鎖問(wè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開(kāi)始截取長(zhǎng)度為2的字符串 int OutStrW = int.Parse(strW); string strS = str.Substring(2, 2);//截取str的子串,從index=2開(kāi)始截取長(zhǎng)度為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(); }
關(guān)于“C#串口接收數(shù)據(jù)中serialPort.close()死鎖的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。