crc16 modbus 查表法 C代码
时间: 2023-08-23 10:05:50 浏览: 103
最全CRC16计算代码(包含直接计算和查表以及表格计算 内含MODBUS/CCITT/CCITT-FALSE/XMODEN等多种校验方式)
以下是CRC16 Modbus的查表法C代码实现:
```c
#include <stdio.h>
#include <stdint.h>
#define POLY 0xA001 // CRC16-Modbus多项式
// 生成CRC16表
uint16_t crc16_table[256];
void crc16_init(void) {
uint16_t i, j, crc;
for (i = 0; i < 256; i++) {
crc = i;
for (j = 0; j < 8; j++) {
if (crc & 0x0001) {
crc = (crc >> 1) ^ POLY;
} else {
crc = crc >> 1;
}
}
crc16_table[i] = crc;
}
}
// 计算CRC16
uint16_t crc16_modbus(uint8_t *data, uint16_t len) {
uint16_t crc = 0xFFFF;
uint16_t i;
for (i = 0; i < len; i++) {
crc = (crc >> 8) ^ crc16_table[(crc & 0xFF) ^ data[i]];
}
return crc;
}
int main() {
crc16_init(); // 初始化CRC16表
uint8_t data[] = {0x01, 0x04, 0x00, 0x00, 0x00, 0x01};
uint16_t crc = crc16_modbus(data, sizeof(data));
printf("CRC16: 0x%04X\n", crc);
return 0;
}
```
在此实现中,我们首先生成了一个256个元素的CRC16表,然后通过循环遍历数据并查表计算CRC16值。最后,我们可以将计算出的CRC16值打印出来以进行验证。
阅读全文