使用指定多项式计算辐射传感器CRC16结果与预期不符求助
旧辐射传感器CRC16校验匹配问题求助
我目前正在调试一款旧辐射传感器的通信协议,遇到CRC16计算不符问题特来求助。该传感器为事件驱动架构,由主设备发起数据传输或数据请求启动通信。每帧报文采用双重校验:CRC16仅校验可变数据块,CRC8校验完整报文。
当前核心问题是CRC16计算结果始终无法匹配预期:根据数据手册说明,数据块校验所用CRC16多项式为CRC16 = X^14 + X^12 + X^5 + 1,是否对应十六进制值0x5021?我已抓取多组带正确CRC16的实测数据,尝试复现计算规则以便自行构造发送报文,但始终无法得到匹配校验值。我已使用通用CRC计算器测试该多项式下所有可能参数组合,也尝试使用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微处理器,其CRC8校验规则已验证可通过通用CRC计算器复现,参数如下:多项式
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
问题排查解决思路
- 优先验证位反转参数:结合该设备CRC8采用输入输出全反转的设计逻辑,CRC16大概率也采用相同的位反转规则。你可先配置参数:初始值
0x0000、输出异或值0x0000、输入数据按字节位反转、输出结果按16位整体反转,带入样本计算验证,0x00000000输出0x0000的特征也符合初始值为0的设定。 - 字节序适配排查:8051为小端架构,旧外设常见按反向字节顺序计算CRC的情况,你可以尝试将4字节数据从最后一个字节到第一个字节倒序排列后,再带入多项式计算,排查字节序带来的计算偏差。
- 校验范围确认:先单独构造1字节的测试数据,通过传感器否定应答获取对应CRC16值,缩小排查范围,排除多字节序、额外字段干扰,确认你当前计算CRC16的范围确实仅包含可变数据块,未混入控制位、报文头等额外字段。
- 反向推导多项式:如果上述参数均不匹配,可使用你已有的样本通过CRC Reveng工具反向推导正确多项式,运行时增加
-b参数指定搜索反转多项式、-w 16指定CRC宽度,输入样本按实际字节顺序填写即可得到准确的参数组合。
内容的提问来源于stack exchange,提问作者borja garcia
相关产品推荐
相关产品推荐

