Как разделить поток данных на пакеты?

У меня есть поток данных с последовательного устройства. У меня есть это как шестнадцатеричная строка, где пакеты данных всегда начинаются с F4,

я использую:

while (_serialPort.BytesToRead > 0)
        {
            var chunk = new byte[_serialPort.BytesToRead];
            _serialPort.Read(chunk, 0, chunk.Length);

            _text += BitConverter.ToString(chunk);
        }

И как это BytesToReadпеременная чанка всегда отличается. Как я должен разделять пакеты по мере их поступления?

Я думаю:

Если строка содержит F4, начать помещать данные в буфер. На следующем F4, остановите, обработайте существующий буфер и начните заполнять снова.

Это жизнеспособный подход? Каков наилучший способ приблизиться к этому?

1 ответ

Стандартная практика заключается в утилизации буфера

//you should re-use the buffer
var chunk = new byte[8]; //this should be the actual packet size sent by the device    

int bytesRead;
while ((bytesRead = _serialPort.Read(chunk, 0, chunk.Length)) > 0)
{
     _text += BitConverter.ToString(chunk, 0, bytesRead);
}

Теперь, если ваши пакеты имеют фиксированную длину, то вы должны быть в порядке после того, как вы установите chunk[] в правильный размер. Если это не так, вы можете использовать StringBuilder для буферизации его как текста, а затем использовать обычные методы анализа строк.

Другие вопросы по тегам