Как читать байты в C # - PullRequest
       3

Как читать байты в C #

4 голосов
/ 19 декабря 2011

Я пытаюсь обработать свой входящий буфер и убедиться, что я получаю все 125 байтов данных при каждой передаче. Я создал байтовый массив. Как я могу узнать, что получено 125 байт данных. Я пытался отобразить количество байтов, но он отображал другое число, и я не уверен, что это правильная кодировка для получения количества полученных байтов.

Вот мой код:

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: ");              
    }
}

1 Ответ

7 голосов
/ 19 декабря 2011

В данный момент вы читаете, пока локальный приемный буфер (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
...