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

CRC-16(Modbus)计算问题:无法向函数传入十六进制值

解决CRC-16(Modbus)计算的输出异常问题

看起来你遇到的核心问题是函数参数类型不匹配,加上代码里的CRC计算逻辑不完整导致的。咱们一步步拆解:

问题分析

  1. 参数类型错误:你的CRC16_2函数接收的是unsigned int *buf,但Modbus CRC是按单字节处理数据的。如果传入的是字节数组(比如你说的十六进制数据数组),用unsigned int*去读取会一次性把4个字节(32位系统)当成一个int值,完全打乱了原始数据的处理顺序,自然得不到正确结果。
  2. CRC计算逻辑不完整:你贴的代码里for循环只写了异或步骤,Modbus CRC还需要后续的移位和多项式异或操作,这部分缺失也会导致结果错误。

修复后的完整代码

#include <stdio.h>
// 移除conio.h,它是非标准库,多数现代编译环境不支持
unsigned int CRC16_Modbus(unsigned char *buf, int len) {
    unsigned int crc = 0xFFFF;
    const unsigned int poly = 0xA001; // Modbus CRC标准使用的反转多项式(对应0x8005的反转)
    
    for (int pos = 0; pos < len; pos++) {
        crc ^= buf[pos]; // 将当前字节异或到CRC的低字节
        
        // 对每个比特位进行循环处理
        for (int i = 0; i < 8; i++) {
            if (crc & 0x0001) { // 检查CRC最低位是否为1
                crc >>= 1;
                crc ^= poly;
            } else {
                crc >>= 1;
            }
        }
    }
    return crc;
}

int main() {
    // 示例:替换成你实际的abc[]十六进制字节数组
    unsigned char abc[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x02};
    int len = sizeof(abc) / sizeof(abc[0]);
    unsigned int result = CRC16_Modbus(abc, len);
    
    printf("CRC-16(Modbus)计算结果:0x%04X\n", result);
    // 上述示例数组的预期结果为0x940B
    return 0;
}

关键修改点

  • 参数类型修正:把unsigned int *buf改成unsigned char *buf,确保每次只处理一个字节的原始数据。
  • 补全CRC核心逻辑:添加了每个比特位的循环处理,严格遵循Modbus CRC的计算规则,使用标准反转多项式0xA001。
  • 移除冗余依赖:去掉了非标准的conio.h,避免在现代编译环境中出现兼容性问题。

使用说明

你只需要把你的abc[]数组中的十六进制数据替换到示例数组位置,编译运行后就能得到符合预期的Modbus CRC结果。

内容的提问来源于stack exchange,提问作者Manu Ch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:08:06