2010-06-03 139 views
3

我正在使用C#從串口接收數據,但存在一些問題。我是新來的,所以我需要一些幫助。.NET中的串口通信

  1. 首先關閉所有我想知道哪些功能是事件驅動:

     
    ReadExisting() 
    Read() 
    Readbyte() 
    Readchar() 
    ReadLine() 
    Readto() 
    
  2. 我怎麼能採取必要的數據形成該端口的輸入流?

    我有靜態大小的協議。我可以使用一個特殊的字符來指定協議數據的限制,哪一個適合這個字符?

  3. 如何處理這個異常:

    C#的SerialPort System.ObjectDisposedException,安全句柄已關閉在System.dll中

回答

6

這些方法都不是「事件驅動「,你會在DataReceived事件中使用它們。當串行端口至少有一個數據字節可供讀取時調用。

不確定「靜態大小」的含義。如果設備發送固定數量的字節,那麼您將使用Read()方法來讀取它們。注意返回值,你只能得到儘可能多的字節。將它們存儲在一個字節[]中,並附加到下一個DR事件中,直到獲得全部。

如果設備發送字符而不是字節,那麼您通常可以利用NewLine屬性。將其設置爲終止響應的字符或字符串。換行符(「\ n」)是最典型的選擇。用ReadLine()讀取響應。在這種情況下不需要緩衝。

當您關閉表單但不確保設備停止發送數據時,您會得到ObjectDisposed異常。請確保在DataReceived事件中僅使用BeginInvoke,而不是Invoke。如果窗體的IsDisposed屬性爲true,則不要調用BeginInvoke。

6

我不能給漢斯的答案添加任何東西,除非說我看到的最大陷阱之一是人們傾向於期望當DataReceived事件觸發時,他們想要接收的所有字節是所有禮物。

例如如果您的消息協議長度爲20個字節,則會觸發DataReceived事件,並嘗試讀取20個字節。他們可能都在那裏,他們可能不在。根據你的波特率,它們很可能不會。

您需要檢查您正在讀取的端口的BytesToRead屬性,並將該值讀入緩衝區。如果有更多字節可用,DataReceived事件將再次觸發。

請注意,DataReceived事件將在要接收的字節數至少等於串行端口的ReceivedBytesThreshold屬性時觸發。默認情況下,我認爲這設置爲1。

例如,如果將此設置爲10,則在等待接收10個或更多字節但不會少於10個字節時觸發事件。這可能會導致問題,也可能不會導致問題,並且我個人偏好將此屬性值設置爲1,以便收到的所有數據都將觸發該事件,即使只接收到1個字節也是如此。

不要犯這樣的錯誤,這會導致事件觸發每接收到一個字節 - 它不會這樣做。