无法使用给定的多项式获得正确的 CRC16

Unable to get the correct CRC16 with a given Polynomial

我正在为一个旧的辐射传感器和他的通信协议而苦苦挣扎。
传感器是事件驱动的,主站通过数据传输或数据请求开始通信。
每个数据报文使用 CRC16 仅检查可变数据块,使用 CRC8 检查所有报文。

我的主要问题是 crc16,根据数据表,用于检查数据块的多边形是:
CRC16 = X^14 + X^12 + X^5 + 1 --> 0x5021 ??

我使用有效的 CRC16 捕获了一些数据并尝试复制预期值以发送我自己的数据传输,但我无法获得相同的值。
我正在使用 sunshine CRC calculator 尝试与该多边形进行任何可能的组合。 我也尝试了 CRC Reveng,但没有结果。

这里有一些 CRC16 正确的数据:.

    Data    | CRC16 (MSB LSB)
14 00 00 0A | 1B 84
15 00 00 0C | 15 88
16 00 00 18 | 08 1D
00 00 00 00 | 00 00
00 00 00 01 | 19 D8
00 00 00 02 | 33 B0
01 00 00 00 | 5A DC
08 00 00 00 | c6 c2
10 00 00 00 | 85 95
80 00 00 00 | 0C EC
ff ff ff ff | f3 99

如果我在电报中发送无效的 CRC16,传感器会发送一个带有预期值的否定确认,因此我可以尝试任何数据以进行测试或在需要时获取更多示例。

如果有用,传感器使用 8 位 8051 微处理器,这是使用 sunshine CRC 检查的有效 CRC8 示例:

CRC8 = X^8 + X^6 + X^3 + 1 --> 0x49
Input reflected   Result reflected

    control byte    |    Data   |CRC16 |  CRC8
01 0E 01 00 24 2A 06 ff ff ff ff f3 99 |-> 0F

感谢任何帮助!

看起来像是多项式的错字。 n 位 CRC 多项式始终以 xn 开头。就像您正确的 8 位多项式一样。 16 位多项式应为 X16 + X12 + X5 + 1,其中fact 是一个很常见的 16 位 CRC 多项式。

为了保留注释中的注意事项,示例中的四个数据字节在每对字节中进行了交换,需要撤消此操作才能获得正确的 CRC。 (CRC8 示例中的控制字节 交换。)

所以14 00 00 0a变成了00 14 0a 00,为此上面描述的CRC给出了预期的0x1b84

我猜 CRC 存储在流中也交换了,所以字节的消息将是 00 14 0a 00 84 1b。这会产生一个总 CRC 为 0 的序列。