单纯用来记笔记而已
#include <stdio.h>
#include <stdint.h>
uint16_t crc16_modbus(uint8_t *data, uint16_t length) {
uint16_t crc = 0xFFFF; // 初始值
for (uint16_t i = 0; i < length; i++) {
crc ^= data[i]; // 将数据的一个字节与 CRC 的低字节进行异或
for (uint8_t j = 0; j < 8; j++) { // 对每个字节的 8 位进行计算
if (crc & 0x0001) { // 如果最低位为1
crc = (crc >> 1) ^ 0xA001; // 右移 1 位并与多项式 0xA001 异或
} else {
crc >>= 1; // 否则直接右移 1 位
}
}
}
// // 交换高低字节
// crc = (crc << 8) | (crc >> 8);
// 将 CRC-16 值拆分为两个字节并赋值给 data 数组的最后两个元素
data[length] = (uint8_t)(crc & 0xFF); // 低字节
data[length + 1] = (uint8_t)((crc >> 8) & 0xFF); // 高字节
return crc; // 返回计算得到的 CRC-16 值
}
int main() {
uint8_t data[] = {0x01, 0x10, 0x40, 0x09, 0x00, 0x02, 0x04, 0x00, 0x00, 0x0d, 0xac, 0x00, 0x00}; // 示例数据
uint16_t length = sizeof(data) / sizeof(data[0]) - 2;
uint16_t crc = crc16_modbus(data, length);
printf("CRC-16 (Modbus): 0x%04X\r\n", crc);
// 打印结果
printf("Data with CRC: ");
for (uint16_t i = 0; i < sizeof(data) / sizeof(data[0]); i++) {
printf("%02X ", data[i]);
}
printf("\r\n");
return 0;
}