userlock.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "userlock.h"
  2. userlock::userlock(QSerialPort *serial, QObject *parent)
  3. {
  4. this->devserial = serial;
  5. }
  6. quint16 userlock::Modbus_Crc(QByteArray &data, quint8 count)
  7. {
  8. quint16 crc,carry_flag,a;
  9. crc = 0xffff;
  10. for (quint8 i = 0; i < count; i++)
  11. {
  12. crc=crc ^ (quint8)(data.at(i));
  13. for (quint8 j = 0; j < 8; j++)
  14. {
  15. a = crc;
  16. carry_flag = a & 0x0001;
  17. crc = crc >> 1;
  18. if (carry_flag == 1)
  19. {
  20. crc = crc ^ 0xA001;
  21. }
  22. }
  23. }
  24. return crc;
  25. }
  26. // 发送数据给下位机
  27. void userlock::sendData(QByteArray &sendData)
  28. {
  29. // qDebug() << "sendData: " << sendData.toHex();
  30. quint16 crc = Modbus_Crc(sendData, sendData.size());
  31. // 输出CRC16校验和
  32. // qDebug() << "CRC16:" << QString::number(crc, 16).toUpper();
  33. sendData.append((quint8)crc);
  34. sendData.append((quint8)(crc >> 8));
  35. sendData.prepend(0x68);
  36. sendData.append(0x16);
  37. // qDebug() << "QByteArray: " << sendData.toHex();
  38. // 发送数据帧
  39. devserial->clear(QSerialPort::AllDirections);
  40. devserial->write(sendData);
  41. devserial->waitForBytesWritten(1000);
  42. }
  43. // 读取下位机发来数据
  44. bool userlock::readData(QByteArray *data, quint16 timeout)
  45. {
  46. if(!devserial->waitForReadyRead(timeout))
  47. {
  48. return false;
  49. }
  50. msleep(100);
  51. *data = devserial->readAll();
  52. qDebug() << "readData: " << data->toHex();
  53. quint8 head = data->at(0);
  54. quint8 end = data->at(data->size() - 1);
  55. if(head == 0x68 && end == 0x16)
  56. {
  57. quint16 crc1 = Modbus_Crc(*(data + 1), data->size() - 3);
  58. quint16 crc2 = quint8(data->at(data->size() - 2));
  59. crc2 <<= 8;
  60. crc2 += quint8(data->at(data->size() - 3));
  61. if(crc1 == crc2)
  62. {
  63. return true;
  64. }
  65. }
  66. return false;
  67. }
  68. bool userlock::readLockStat(void)
  69. {
  70. quint8 dataArray[] = {0x01, 0x02, 0x00};
  71. QByteArray ba(reinterpret_cast<char*>(dataArray), sizeof(dataArray));
  72. this->sendData(ba);
  73. QByteArray data;
  74. if(true == readData(&data, 1000))
  75. {
  76. workstat = lockWorkStat::open;
  77. return true;
  78. }
  79. return false;
  80. }
  81. bool userlock::openLock(void)
  82. {
  83. quint8 dataArray[] = {0x01, 0x03, 0x00};
  84. QByteArray ba(reinterpret_cast<char*>(dataArray), sizeof(dataArray));
  85. this->sendData(ba);
  86. QByteArray data;
  87. if(true == readData(&data, 1000))
  88. {
  89. if(data.at(2) == 0x83
  90. && data.at(3) == 0x01
  91. && data.at(4) == 0x01)
  92. {
  93. return true;
  94. }
  95. else{
  96. return false;
  97. }
  98. }
  99. }
  100. bool userlock::closeLock(void)
  101. {
  102. quint8 dataArray[] = {0x04, 0x00, 0x21};
  103. QByteArray ba(reinterpret_cast<char*>(dataArray), sizeof(dataArray));
  104. this->sendData(ba);
  105. QByteArray data;
  106. if(true == readData(&data, 1000))
  107. {
  108. }
  109. }
  110. bool userlock::checkLock(void)
  111. {
  112. }