#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;
}
 

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐