2013-05-10 79 views
1

我正在用這個抨擊我的頭。閱讀串行數據

我正在爲測試血液的機器編寫一個串行應用程序。它以線路形式發送信息,以\r\n結尾。

問題是,我每隔一段時間運行機器,都會漏掉一些線條,或者它會複製它們。我停下來重新啓動,然後數據正常。

林使用DataReceived事件檢索:

try 
{ 
    this.the = thePort.ReadLine(); 
} 
catch (TimeoutException ex) {} 

我,爲什麼有時候它錯過這將是S1說通信已經開始的第一行完全糊塗了,並在同一時間將複製這之後的數據。

我可以通過將每行讀取附加到文本框來看到這一點。

+0

您是否正確處理完每次使用後的端口? – 2013-05-10 15:02:58

+0

串行數據發送後,您不能保證在一次讀取中擁有整個數據,您必須連續讀取數據。有數百個如果不是數千個正確讀取串行數據的例子。每次收到數據時,應該將所有字節放在一起而不是替換數據。 – 2013-05-10 15:28:01

回答

3

由於每次都覆蓋這個,你會遇到競爭狀況。事件發生的順序略微不合適或太接近,應用程序無法應付。考慮使用一種線程安全的方法來鬆開你的數據,比如將它添加到一個緩衝區或一個StringBuilder中,並在它周圍提供一些併發保護。

+0

任何代碼示例?這個東西對我來說是相當新的 – Glen 2013-05-10 15:10:41

+0

我的意思是如何使它線程安全的例子?我明白你的意思了 – Glen 2013-05-10 15:12:15

+0

嘗試使用你閱讀的每一行事件來更新你的控制檯,而不是使用一個被覆蓋的變量。一個簡單的測試是使用Console.WriteLine直接寫出thePort.ReadLine()輸出。 – 2013-05-10 15:28:10