2011-11-27 26 views
1

我需要從串行端口獲取傳入數據,將'ReadExisting'字符串放入隊列中,然後重新進入用戶界面。C#如何將串行輸入數據放入隊列並使用背景工作器取消隊列

在de-que過程中,我將格式化傳入的字符串以刪除不需要的字符,添加LineFeeds(傳入中沒有EOL字符)等,並將字符串的各個部分發布到多個控件中(列表框,文本框)進行查看。

這是據我已經能夠去創建傳入數據字符串(RxString):

private void serialPort1_DataReceived(object sender, 
System.IO.Ports.SerialDataReceivedEventArgs e)  
{   
RxString = serialPort1.ReadExisting();   
this.Invoke(new EventHandler(DisplayText));  
} 

我能夠得到傳入的數據,但是當我嘗試對其進行格式化和顯示一些進來的數據丟失或丟失或者某些內容變得不可讀。如果我沒有格式化文本&直接發送到列表框中,數據全部存在,但由於所有額外的代碼字符而無法使用。

我想使用backgroundworker處理(DisplayText),以便串行數據可以進入隊列,以便在背景工作人員將信息放置在屏幕上時不會丟失。除非有更好的辦法。

+1

沒有必要用「C#」來標題。這就是標籤的用途。 –

+0

非常不清楚,您沒有發佈實際格式化代碼,因此包含錯誤。在調用之前首先組裝整個響應通常非常重要,當您不調試時,ReadExisting()通常只返回一個或兩個字符。如果可以,請利用ReadLine()。 –

+0

串口的末端是什麼?它使用什麼協議? – dbasnett

回答

2

我假設數據當時只有一行,因此您始終可以使用Queue-類,並使用方法Enqueue添加傳入數據。

並獲得從後臺工作者的項目,只要使用Dequeue

以下是關於Queue -class

http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

爲例的MSDN,文章的鏈接:

private Queue<string> data = new Queue<string>(); 

private void Rx_GetData(e) 
{ 
    var rxString = e.ReadExisting(); 
    data.Enqueue(rxString); 
} 

private void BackgroundWorker_DoWork() 
{ 
    while(rxConn.IsConnected) // Haven't worked with serial connections, so I don't know the proper property here.. 
    { 
     if(data.Count > 0) 
     { 
      var str = data.Dequeue(); 
      FormatString(str); 
     } 
     Thread.Sleep(10); 
    } 
} 
+0

NoLifeKing-好的電話。實際上,我在搜索過去幾周的過程中引用了這種方法,但做了一些測試,看起來這會起作用。謝謝。 – user1062142

+0

@NoLifeKing C#有效地處理例程BackgroundWorker_Dowork中的無限循環嗎?我沒有C#經驗,但是我會避免一直使用CPU資源的無限循環。 – Jeff

+0

@Jeff我剛剛添加了無限循環作爲佔位符,對於性能,您應該用檢查連接是否仍然打開以及線程來替換'true'。睡覺(10)不要佔用系統的每個資源。 – NoLifeKing

相關問題