CRC-16(Modbus)计算问题:无法向函数传入十六进制值
解决CRC-16(Modbus)计算的输出异常问题
看起来你遇到的核心问题是函数参数类型不匹配,加上代码里的CRC计算逻辑不完整导致的。咱们一步步拆解:
问题分析
- 参数类型错误:你的
CRC16_2函数接收的是unsigned int *buf,但Modbus CRC是按单字节处理数据的。如果传入的是字节数组(比如你说的十六进制数据数组),用unsigned int*去读取会一次性把4个字节(32位系统)当成一个int值,完全打乱了原始数据的处理顺序,自然得不到正确结果。 - 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
相关产品推荐
相关产品推荐

