在工业领域,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。
文章作者:沃航科技