You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Modbus CRC-16查表法计算结果不符的技术咨询

Modbus CRC-16 查表法结果不一致的原因分析

核心问题是你使用的在线工具默认CRC参数与Modbus标准CRC-16的参数不匹配,这是这类问题最常见的坑。

Modbus CRC-16的标准参数必须严格符合以下几点:

  • 多项式:0x8005(对应数学表达式 x^16 + x^15 + x^2 + 1)
  • 初始值:0xFFFF
  • 输入字节处理:反向(每个字节的8位从最低位到最高位颠倒)
  • 输出结果:反向(16位结果整体颠倒) + 异或值0x0000

你的两个案例验证:

  1. 数据01-01-02-02

    • 按照Modbus标准计算,正确CRC确实是0x1818
    • 你得到的0xB9D0,大概率是工具用了正向输入、初始值0x0000的通用CRC-16默认配置,和Modbus的规则不兼容。
  2. 数据00-01-80-05

    • 这组数据是Modbus CRC-16多项式0x8005的4字节扩展形式(将16位多项式补前导零扩展为32位),按照标准计算,CRC结果确实应为0x0000
    • 工具返回的0x27F0,同样是参数不匹配导致的错误结果。

解决办法:

  • 自己实现查表法时,必须严格按照Modbus的标准参数构建查表逻辑,不能直接套用通用CRC-16的表。
  • 用在线工具验证时,一定要手动指定Modbus对应的参数(部分工具会直接提供"Modbus CRC-16"预设选项,优先选择该选项),而非使用默认的CRC-16配置。

以下是一个简化的查表法核心逻辑示例(伪代码):

// 预先生成的Modbus CRC-16表(基于反向多项式0xA001,对应原多项式0x8005)
uint16_t crc_table[256] = {
    0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
    // ... 完整表省略
};

uint16_t modbus_crc(uint8_t *data, int len) {
    uint16_t crc = 0xFFFF;
    for (int i = 0; i < len; i++) {
        crc = (crc >> 8) ^ crc_table[(crc ^ data[i]) & 0xFF];
    }
    return crc; // 已包含反向输出和异或0x0000的处理
}

该函数计算01-01-02-02会得到0x1818,计算00-01-80-05会得到0x0000,与你的手动计算结果一致。

内容的提问来源于stack exchange,提问作者chao gao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.04 03:12:32