2011-12-19 89 views
4

我試圖處理我的傳入緩衝區,並確保我在每次傳輸時獲得了所有125字節的數據。我創建了一個字節數組。我如何知道正在接收125個字節的數據。我試圖顯示字節數,但它顯示不同的數字,我不確定是否正確的編碼來獲得接收的字節數。如何讀取C#中的字節

這裏是我的代碼:

void datareceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    myDelegate d = new myDelegate(update); 
    listBox1.Invoke(d, new object[] { }); 
} 


public void update() 
{ 
    Console.WriteLine("Number of bytes:" + serialPort.BytesToRead); // it shows 155 

    while (serialPort.BytesToRead > 0) 
     bBuffer.Add((byte)serialPort.ReadByte());   
    ProcessBuffer(bBuffer); 
} 

private void ProcessBuffer(List<byte> bBuffer) 
{ 
    // Create a byte array buffer to hold the incoming data 
    byte[] buffer = bBuffer.ToArray(); 

    // Show the user the incoming data // Display mode 
    for (int i = 0; i < buffer.Length; i++) 
    { 
     listBox1.Items.Add("SP: " + (bBuffer[43].ToString()) + " " + " HR: " + (bBuffer[103].ToString()) + " Time: ");    
    } 
} 
+0

我想澄清我的答案(我最初誤解了問題),但:'只BytesToRead'指本地接收BU FFER;它不會告訴你什麼是傳入的。通常情況下,像BytesToRead這樣的主要用途是:如果你想在處理已經存在的數據或阻塞(同步)之間做出決定,或者做一個'BeginRead'(async) – 2011-12-19 07:08:59

回答

7

在你正在閱讀,直到本地接收緩衝區BytesToRead)的時刻是空的,但是,更好的方法是保持一個緩衝區和偏移量,循環,直到你有你需要什麼,即使這意味着等待 - 即

byte[] buffer = new byte[125] 
int offset = 0, toRead = 125; 

... 

int read; 
while(toRead > 0 && (read = serialPort.Read(buffer, offset, toRead)) > 0) { 
    offset += read; 
    toRead -= read; 
} 
if(toRead > 0) throw new EndOfStreamException(); 
// you now have all the data you requested 
+0

感謝marc的回覆。在嘗試創建新的緩衝區[125]數組時,我收到錯誤消息。我需要任何特定的命名空間嗎? – fb69 2011-12-19 07:49:58

+0

@ fb69 d'oh!不,我需要更好的手指;應該讀取'新字節[125]' - 修復 – 2011-12-19 07:51:47