Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

55 lignes
1.4 KiB

  1. #include "crc.h"
  2. quint16 CalculateCrc(const QByteArray &data)
  3. {
  4. quint16 crc = 0xFFFF; // MODBUS初始值
  5. const quint16 polynomial = 0xA001; // MODBUS多项式(0x8005的反转)
  6. for (int i = 0; i < data.size(); ++i)
  7. {
  8. crc ^= static_cast<quint8>(data.at(i));
  9. for (int bit = 0; bit < 8; ++bit)
  10. {
  11. if (crc & 0x0001)
  12. { // 检查最低位
  13. crc = (crc >> 1) ^ polynomial; // 右移并异或
  14. } else
  15. {
  16. crc >>= 1; // 仅右移
  17. }
  18. }
  19. }
  20. return crc;
  21. }
  22. bool CrcCheck(const QByteArray &data)
  23. {
  24. //首先对接收报文的长度进行检验
  25. if (data.size() < 3)
  26. {
  27. return false;
  28. }
  29. //对接收的报文进行CRC校验
  30. QByteArray payload = data.left(data.length() - 2);
  31. //分离接收值的crc校验位
  32. quint8 receivedCrcLow = static_cast<quint8>(data.at(data.length() - 2));
  33. quint8 receivedCrcHigh = static_cast<quint8>(data.at(data.length() - 1));
  34. //计算返回的报文的crc
  35. quint16 crc = CalculateCrc(payload);
  36. quint8 calcCrcLow = crc & 0xFF;
  37. quint8 calcCrcHigh = (crc >> 8) & 0xFF;
  38. //比较计算的crc值和接收到的crc值是否一致
  39. if(calcCrcLow == receivedCrcLow && calcCrcHigh == receivedCrcHigh)
  40. {
  41. return true;
  42. }
  43. else
  44. {
  45. return false;
  46. }
  47. }