2011-06-09 210 views
0

我正在嘗試使用SerialPort類來處理串行端口。C#串行端口通信

該應用程序要求我們先收到一個命令,然後在20ms內給出答覆;問題在於,我們讀取的命令與實際命令之間存在延遲(最長15ms),並且我們沒有時間將回復發送回去。

我們需要讀取的命令的長度固定爲20個字節,我們每次從輸入緩衝區輪詢一個字節。

serialPort.Read(input, 0, 1). 

我不知道這個過程有什麼問題。

回答

2

爲什麼每次讀一個字節?如果你期待的20個字節,你可以寫:

byte[] buffer = new byte[20]; 
int bytesRead; 
int totalBytesRead = 0; 
while ((bytesRead = serialPort.Read(buffer, totalBytesRead, buffer.Length - totalBytesRead)) != 0 
    && totalBytesRead < buffer.Length) 
{ 
    totalBytesRead += bytesRead; 
} 

在這一點上,你把所有20個字節或已到達流的末尾。

你是什麼意思?「我們閱讀的命令和實際的命令之間存在延遲(最多15毫秒)」?

+0

我將使用範圍來檢查線上的數據,當我收到命令時,我將發送一封信與實際命令進行比較,從範圍,我測量延遲高達15ms,我想知道這是什 – lin 2011-06-10 16:03:45

+0

你說當你告訴發送者發送一個字節,並且接收者實際讀取它時,會有多達15毫秒的時間?有很多事情可能會導致這種情況。發送者可能會暫時緩衝,接收者可能會緩衝。接收者可能無法立即*對角色作出反應。有什麼方法可以確定您的計算機何時接收到該角色? 15毫秒是相當可疑的,因爲這是你將從.NET程序中獲得的最佳分辨率。 – 2011-06-10 17:58:53

1

您是否在使用DataRecieved事件?前段時間我有類似的錯誤,顯然有些功能沒有使用事件處理程序就不會被調用。

+0

我沒有使用DataRecieved事件,你的意思是我應該使用DataRecieved事件,逐個輪詢數據的insteading? – lin 2011-06-10 11:46:49

+0

@lin:使用'DataReceived'是一個非常好的主意。 – 2011-06-10 17:59:13

+0

您應該定義使用事件,在我的情況下,我從來沒有實際收到任何數據而沒有使用該事件,但花了幾天的時間才弄清楚。 – Bas 2011-06-14 13:20:33