字节流中数据包的识别

kar*_*rra 5 checksum serial-port serial-communication packet

我在与加速度计传感器的通信方面遇到了一些问题。传感器连续输出约 8000 个读数/秒。传感器通过适配器插入 USB 端口并显示为 com4。我的问题是我似乎无法从字节流中挑选出传感器读取数据包。数据包大小为 5 个字节,格式如下:

            High nibble                     Low nibble

Byte 1      checksum, id for packet start   X high
Byte 2      X mid                           X low
Byte 3      Y high                          Y mid
Byte 4      Y low                           Z high
Byte 5      Y mid                           Y low
Run Code Online (Sandbox Code Playgroud)

X, y, z 是加速度。

在传感器的文档中,它指出第一个字节中的高半字节是校验和(计算的 Xhigh+Xlow+Yhigh+Ylow+Zhigh+Zlow),也是数据包开始的标识。我对针对外部设备进行编程还很陌生,无法真正掌握如何将校验和用作包开始的标识符(校验和不会一直更改吗?)。这是识别数据包开始的常用方法吗?有谁知道如何解决这个问题?

任何帮助将不胜感激。

saw*_*ust 4

...无法真正掌握如何将校验和用作包开始的标识符(校验和不会一直变化吗?)。

是的,校验和会改变,因为它是从数据导出的。
但即使是固定值的数据包起始半字节(其本身)也不足以(最初)识别(或验证)数据包。由于这是二进制数据(而不是文本),因此该数据可以采用与任何固定值数据包开头相同的值。如果您对这个起始半字节进行了简单的扫描,那么该算法很容易将数据半字节错误地识别为起始半字节。

这是识别数据包开始的常用方法吗?

不,但考虑到高数据速率,这似乎是一种最小化数据包大小的方案。

有谁知道如何解决这个问题?

您可能必须首先扫描每个字节序列一次五个(即数据包的长度)。
计算该“数据包”的校验和,并将其与第一个半字节进行比较。
匹配表明您(可能)进行了数据包对齐。
不匹配意味着您应该丢弃第一个字节,并测试下一个可能的数据包,该数据包将以第二个字节开始(即移动 4 个剩余字节并附加新的第 5 个字节)。

一旦实现(或假设)数据包对齐,您需要不断验证每个数据包的校验和,以确认数据完整性并确保数据包数据对齐。任何校验和错误都应强制再次寻找正确的数据包数据对齐(从当前“数据包”的第二个字节开始)。