我从串行设备传输数据。我将此作为十六进制字符串,其中数据包始终以F4
开头。
我正在使用:
while (_serialPort.BytesToRead > 0)
{
var chunk = new byte[_serialPort.BytesToRead];
_serialPort.Read(chunk, 0, chunk.Length);
_text += BitConverter.ToString(chunk);
}
由于它是BytesToRead
,因此块变量总是不同的。我们如何在数据包进入时将其拆分?
我在想:
如果字符串包含F4
,
开始将数据推入缓冲区。
在下一个F4
,停止,处理现有缓冲区并再次开始填充。
这是一种可行的方法吗? 解决这个问题的最佳方式是什么?
答案 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将其缓冲为文本,然后使用通常的字符串解析技术。