如何将数据流拆分成数据包?

时间:2016-08-01 19:29:53

标签: c# string serial-port

我从串行设备传输数据。我将此作为十六进制字符串,其中数据包始终以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 个答案:

答案 0 :(得分:0)

标准做法是回收缓冲区

//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将其缓冲为文本,然后使用通常的字符串解析技术。