2011-09-09 56 views
0

我正在Visual Studio C#上的項目。是否延遲塊數據接收

我正在從通過串口連接到PC的設備收集數據。 首先我發送一個請求命令,然後等待響應。 發送請求命令後,設備響應延遲1秒。 事情是設備可能無法到達,有時可能無法響應。 爲了等待響應(如果有)並且不提前發送下一個數據請求命令,我通過System.Threading.Thread方法進行延遲。

我的問題是,如果我延長了延遲時間,我是否會丟失串口數據接收。

我使用的延時功能是:

private void Delay(byte WaitMiliSec) 
    { 
     // WaitTime here is increased by a WaitTimer ticking at every 100msec 

     WaitTime = 0; 
     while (WaitTime < WaitMiliSec) 
     { 
      System.Threading.Thread.Sleep(25); 
      Application.DoEvents(); 
     } 
    } 
+0

你不能使用DataReceived事件嗎? http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx –

+0

不,你不會失去串口,但我建議你減少thread.sleep並檢查端口連接或者如果是,則調用數據端口,否則將其放入遞歸函數中,如果沒有連接且數據未收到,則再次調用。 –

回答

2

沒有 - 你不會丟失任何數據 - 串行端口都有它自己的緩衝區,不依賴於你的應用程序在所有。操作系統和硬件將爲您處理。

我建議重構數據發送/接收到它自己的任務/線程。這樣你就不需要Application.DoEvents();

如果你發佈一些更多的發送/接收代碼,我可能會幫你。

PS:在我看來,你的代碼將無法正常工作(WaitTime總是零),但我想這只是一個片段嗎?

+0

感謝您的回覆, –

+0

感謝您的回覆,但我沒有得到重構。 正如我所說,設備可能無法響應。所以我讓發送和接收分離。我發送一個命令並等待1秒延遲,然後繼續發送下一個命令。如果從設備返回,它將通過serialPort組件自帶的函數serialPort1_DataReceived捕獲。接收到的數據在那裏評估。 順便說一句,你說延遲似乎不會工作,但工程。 –

+0

重構只是反映不改變行爲的代碼中的更改。我會把所有內容放在一個線程/任務中,檢查連接,發送命令,等待數據可用或超時,然後接收/處理數據或中止 - 在單獨的線程中進行轉換,以免阻塞用戶界面。 – Carsten