#include "crc.h" quint16 CalculateCrc(const QByteArray &data) { quint16 crc = 0xFFFF; // MODBUS初始值 const quint16 polynomial = 0xA001; // MODBUS多项式(0x8005的反转) for (int i = 0; i < data.size(); ++i) { crc ^= static_cast(data.at(i)); for (int bit = 0; bit < 8; ++bit) { if (crc & 0x0001) { // 检查最低位 crc = (crc >> 1) ^ polynomial; // 右移并异或 } else { crc >>= 1; // 仅右移 } } } return crc; } bool CrcCheck(const QByteArray &data) { //首先对接收报文的长度进行检验 if (data.size() < 3) { return false; } //对接收的报文进行CRC校验 QByteArray payload = data.left(data.length() - 2); //分离接收值的crc校验位 quint8 receivedCrcLow = static_cast(data.at(data.length() - 2)); quint8 receivedCrcHigh = static_cast(data.at(data.length() - 1)); //计算返回的报文的crc quint16 crc = CalculateCrc(payload); quint8 calcCrcLow = crc & 0xFF; quint8 calcCrcHigh = (crc >> 8) & 0xFF; //比较计算的crc值和接收到的crc值是否一致 if(calcCrcLow == receivedCrcLow && calcCrcHigh == receivedCrcHigh) { return true; } else { return false; } }