#include <cstdint>
// 计算modbus CRC校验
uint16_t modbus_crc(const uint8_t* buf, size_t len) {
uint16_t crc = 0xFFFF;
for (size_t pos = 0; pos < len; pos++) {
crc ^= (uint16_t)buf[pos];
for (int i = 0; i < 8; i++) {
if (crc & 0x0001) {
crc >>= 1;
crc ^= 0xA001;
}
else {
crc >>= 1;
}
}
}
return crc;
}
#include <iostream>
int main() {
uint8_t data[] = {0x08, 0x10, 0x01, 0x06, 0x08, 0x02, 0x04, 0x09, 0x03, 0x96, 0x00, 0x28, 0x23};
size_t len = sizeof(data) / sizeof(data[0]);
uint16_t crc = modbus_crc(data, len);
std::cout << std::hex << crc << std::endl; // 输出校验值
return 0;
}