- #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<quint8>(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<quint8>(data.at(data.length() - 2));
- quint8 receivedCrcHigh = static_cast<quint8>(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;
- }
- }
|