2013-08-21 42 views

回答

2

你不能。也就是說,如果您擁有的是BaseStream,則無法保證您收到了所有內容。

有兩種方法,你可以知道你是否已經收到了一切:

  1. 發送長度字作爲第2或4個字節的數據包。這表示將有多少字節。您的讀者然後讀取那個長度字,讀取那個字節,並且知道它完成了。
  2. 同意記錄分隔符。這對於文本非常有用。例如,您可能會決定空字節或行結束字符表示數據結束。這對於任意二進制數據來說更難,但是可能的。見評論。

或者,根據您的應用程序,您可以進行某種計時。也就是說,如果您在X秒(或毫秒)內沒有收到任何新消息,則認爲您已收到一切。如果發件人速度特別慢,這就有一個顯而易見的缺點,即不能很好地工作。

+0

記錄分隔符通常與二進制數據結合使用*字節填充*。就我個人而言,我將這兩種方法結合在一起使用,它允許在發生錯誤後重新同步。 –

+0

@BenVoigt:好點。 –

+0

我正在使用我無法操作的通信協議。 :( –

0

也許你可以試試SerialPort.BytesToRead財產。

+0

我想用流來做。我無法使用數據將SerialPort類傳遞到類中,但我可以使用流對象。 –

+0

這會有點困難。串口編程的一個特點是,你無法精確地分辨出通過端口的數據的*長度。您可能必須通過嘗試讀取少量字節並將其緩存在緩衝區中來實現自己的緩衝系統。 – nim

相關問題