Files
2026-04-23 13:56:52 +08:00

44 lines
1.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "utils.h"
/*
生成多项式 (x^16 + x^15 + x^2 + 1
*/
uint16_t modbus_crc16(uint8_t* data, int length)
{
uint16_t crc = 0xFFFF; // 初始值FFFF
uint16_t polynomial = 0x8005; // 多项式8005
for (int i = 0; i < length; i++) {
// 输入反转(REFIN):对每个字节进行位反转
uint8_t byte = data[i];
uint8_t reversed_byte = 0;
for (int j = 0; j < 8; j++) {
reversed_byte = (reversed_byte << 1) | (byte & 0x01);
byte >>= 1;
}
crc ^= (reversed_byte << 8); // 与高字节异或
for (int j = 0; j < 8; j++) {
if (crc & 0x8000) { // 检查最高位
crc = (crc << 1) ^ polynomial;
} else {
crc <<= 1;
}
}
}
// 输出反转(REFOUT):对16位CRC结果进行位反转
uint16_t reversed_crc = 0;
for (int i = 0; i < 16; i++) {
reversed_crc = (reversed_crc << 1) | (crc & 0x0001);
crc >>= 1;
}
// 结果异或值(XOROUT)0000(实际不变)
return reversed_crc ^ 0x0000;
}