我们为嵌入式设备设计了简单的固定长度协议。每个数据包只有两个字节:
bits | 15..12 | 11..4 | 3..0 |
| OpCode | DATA | CRC4 |
我们使用“基于 crc 的成帧”,即接收方收集两个字节,计算 CRC4,如果匹配,则认为帧有效。如您所见,没有帧开始或帧结束。
有一个问题:CRC4 的推荐消息长度为 11 位,此处计算为 12 位。据我了解,这意味着 CRC 错误检测属性会降低(但我不确定会降低多少)。
(顺便说一句,如果有人需要 CRC4(或任何其他)的代码并且觉得自己没有足够的技能来编写它,boost 有非常好的 boost::crc 函数可以计算任何 crc )
问题是:这种基于 crc 的框架不起作用,并且我们得到框架错误,即来自一条消息的第二个字节和来自以下消息的第一个字节有时会形成正确的消息。
我的问题是 - 有没有办法在不添加更多字节的情况下纠正框架?我们花了相当长的时间压缩这两个字节中的所有内容,就这样扔掉它会有点难过。不过,我们在操作码字段中确实有一个备用位。
- 基于时间的成帧不会很可靠,因为我们的无线电频道喜欢一次“吐出”几个数据包
- 也许还有其他一些比 CRC4 更有效的错误检测方法?
如果我们必须附加更多字节,那么最好的方法是什么?
- 我们可以使用帧开始字节和字节填充(例如 COBS)(+2 个字节,但我不确定如何处理损坏的消息)
- 我们可以使用帧开始半字节并将 CRC 扩展为 CRC8(+1 字节)
- 还有什么?