在工业领域,modbus是最常用的传输总线。最常用的modbus就是modbus rtu。这里小沃贡献一个modbus rtu的crc校验代码 。
uint16 GetCrcData(uint8 *data, uint32 len) {
uint16 crc = 0xffff; // 16位crc寄存器预置
for (uint32 i = 0 ; i < len ; i++) { // 循环计算每个数据
crc ^= data[i]; // 将八位数据与crc寄存器亦或,然后存入crc寄存器
for (uint8 j = 0; j < 8; j++) { // 循环计算数据的
if (crc & 0x0001) { // 判断右移出的是不是1,如果是1则与多项式进行异或。
crc >>= 1; // 将数据右移一位
crc ^= 0xa001; // 与上面的多项式进行异或
} else { // 如果不是1,则直接移出
crc >>= 1; // 将数据右移一位
}
}
}
return (crc << 8) | (crc >> 8);
}上面的代码生成crc的效果如下:
uint8 data[] = { 0x01, 0x03, 0x08, 0x00, 0x01, 0x01 };
int main () {
printf("crc:0x%04x\n", GetCrcData(data, sizeof(data)));
}
上面的代码校验crc的效果如下:
uint8 data[] = { 0x01, 0x03, 0x08, 0x00, 0x01, 0x01, 0x87, 0xfa };
int main () {
printf("crc:0x%04x\n", GetCrcData(data, sizeof(data)));
}
大家看见了吧,返回为0。
文章作者:沃航科技