2012-07-20 82 views
0

我想在c#應用程序中讀取來自GSM調制解調器的消息。我寫了下面的代碼,並使用後臺工作器在單獨的線程上實現Thread.sleep()。但是我使用port.ReadExisting()的時候,沒有任何內容正在從端口讀取。我使用錯誤的方式處理後臺工作?使用後臺工作人員的方式是否正確

private void btn_Read_Click(object sender, EventArgs e) 
    { 
     lvwMessages.Items.Clear(); 
     status_other.Visible = true; 
     status_other.Text = "Loading messages..."; 
     if (read_all.Checked) 
     { 
      port.WriteLine("AT+CMGL=\"ALL\""); 

     } 
     else if (read_unread.Checked) 
     { 
      port.WriteLine("AT+CMGL=\"REC UNREAD\""); 
     } 
     port.DiscardOutBuffer(); 
     port.DiscardInBuffer(); 

     backgroundWorker1.RunWorkerAsync(); 
    } 
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     Thread.Sleep(5000); 
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
    string res = port.ReadExisting();// here no data is fetched into res 
     //rest of the code 
+0

你確定有東西要讀嗎? – 2012-07-20 11:09:39

+0

是有數據要讀取。我的超級終端顯示它 – Cdeez 2012-07-20 11:11:59

+0

是否正在觸發RunWorkerCompleted事件並正在執行讀取的現有代碼?你在這裏設置了一個斷點嗎? – dtsg 2012-07-20 11:12:01

回答

2

其實,如果portSerialPort那麼你做錯了。 SerialPort有一個DataReceived事件,它是異步的並在數據進入時自動調用。這允許您逐步構建您的回覆,並在收到完整回覆時檢測代碼。

您可以不是只需等待5秒即可獲得完整答覆。

例子:

private String m_receivedData = String.Empty; 

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    m_receivedData += (sender as SerialPort).ReadExisting(); 

    if (<check whether m_receivedData contains everything I need> == true) 
    { 
     ProcessData(m_receivedData); 
     m_receivedData = String.Empty; 
    } 
} 

請注意port_DataReceived被稱爲一個單獨的線程,所以你需要使用Invoke,如果你要更新的GUI。

編輯
只是要清楚:一個BackgroundWorker應該被用來在後臺執行操作,報告狀態和/或當它完成報告。僅僅使用它來暫停並不是一件有用的事情,特別是當實際流程確實包含一些「等到數據存在」的機制時,這是我上面描述的事件。

+0

是之前。這可能不是讀取端口的空閒方式。我會嘗試與你的建議。但我想知道爲什麼在上面的情況port.ReadExisting()不讀取任何數據? – Cdeez 2012-07-20 11:15:01

+1

也許是因爲數據還沒有被讀取?或者數據速度非常快,以至於'port.DiscardOutBuffer(); port.DiscardInBuffer();'拋棄它?無論如何,請刪除這兩行......儘可能:在有些情況下,「BackgroundWorker」是有用的。這不是其中的一個。 – 2012-07-20 11:39:06

1

是,您使用後臺工作以錯誤的方式
更好的將使用直接的數據接收的SerialPort的事件,或者如果你想使用基於時間的解決方案一個單次定時器會更好。

+0

感謝您的建議,我會盡力去與它。但讓我知道爲什麼端口不讀取任何數據? – Cdeez 2012-07-20 11:16:26

+0

我不確定您的計算機有多快,但放棄...緩衝區函數應在WriteLine – user287107 2012-07-20 11:34:29