2011-08-31 30 views
0

我有一個包裝類,它包裝了.Net的SerialPort類來執行調制解調器操作和數據流。當我從SerialPort對象讀取數據時,先前寫入端口的數據位於接收緩衝區中。這是我可以用SerialPort對象改變的行爲嗎?我還沒有找到阻止我的傳出數據在接收緩衝區中結束的類的屬性。SerialPort數據寫入結束於接收緩衝區

我用SerialPort.Write()寫數據,這是我做的讀取數據

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    Task.Factory.Startnew(() => WriteToBuffer()); 
} 

// ... 

private void WriteToBuffer() 
{ 
    string data = string.Empty; 

    lock(_serialPort) 
    { 
     StringBuilder sb = new StringBuilder(); 

     while(_serialPort.BytesToRead > 0) 
     { 
      sb.Append(_serialPort.ReadExisting()); 
     } 

     data = sb.ToString(); 
    } 

    // .. then do some additional processing 
} 

我在非阻塞的方式讀取數據,因爲我寧願是偏執狂,而不是什麼錯過任何接收到的數據事件並讓客戶端代碼認爲存在某種類型的超時。

我可以通過發送ATE0來防止Hayes AT命令被複制到接收緩衝區,但是在調制解調器連接到遠程調制解調器後,我發送的任何數據仍在蠕變到接收緩衝區。

有什麼我可以做的嗎?很難只檢查並看看我最後寫入緩衝區的內容並忽略它,因爲有時我一次讀取一個字節,並且是返回的數據的一部分。例如,如果我發送「ID 123」之類的東西,我可能會用while循環讀取「ID」,並發現有0個字節要讀取,因此它停在那裏。我知道我可以每次調用Thread.Sleep(),但我認爲這不是一個好習慣。

我可以期待所有調制解調器中的回聲行爲嗎?如果是這樣,那麼我可以添加代碼來過濾我寫入的數據。

+0

聽起來像你有'回聲'的東西。我無法回想,如果'SerialPort'類可用,但大多數應用程序都有這個選項。看看你是否可以關閉它。 – leppie

+0

是的,這是我的問題,我可以「關閉」的唯一事情就是迴應AT命令。其他一切都會回來。我試圖將該行爲添加到我的應用中,這就是問題所在。 – jlafay

+0

它被稱爲「全雙工」模式。無論您與哪個設備通話,都必須配置爲半雙工。這是無法猜測的,請查看設備手冊。編寫代碼來過濾echo-ed命令當然也是可以的。 –

回答

0

我嘗試了一些其他調制解調器和輸入緩衝區中返回的寫入數據,就像我嘗試的原始調制解調器模型一樣。我的解決方案是過濾掉寫入的數據以正確讀取來自遠程調制解調器的其他數據。