rfid.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. #include <QDir>
  2. #include <QCoreApplication>
  3. #include "rfid.h"
  4. #include "config.h"
  5. #include "ModuleReader.h"
  6. extern config *pconfig;
  7. rfid::rfid(QObject *parent) : QThread(parent)
  8. {
  9. }
  10. void rfid::slot_set_thread_stop(void)
  11. {
  12. this->threadstatus = false;
  13. }
  14. #define PRESET_VALUE 0xFFFF
  15. #define POLYNOMIAL 0x1021
  16. quint16 rfid::uiCrc16Cal(QByteArray &data, quint8 count)
  17. {
  18. quint8 ucI,ucJ;
  19. quint16 uiCrcValue = PRESET_VALUE;
  20. for(ucI = 0; ucI < count; ucI++)
  21. {
  22. // uiCrcValue = uiCrcValue ^ (quint8)(data.at(ucI));
  23. quint16 xorFlag = 0;
  24. quint16 bit = 0;
  25. quint16 dcdBitMask = 0x80;
  26. for(ucJ = 0; ucJ < 8; ucJ++)
  27. {
  28. xorFlag = uiCrcValue & 0x8000;
  29. uiCrcValue <<= 1;
  30. bit = (((quint8)(data.at(ucI)) & dcdBitMask) == dcdBitMask);
  31. uiCrcValue |= bit;
  32. if(xorFlag)
  33. {
  34. uiCrcValue = uiCrcValue ^ POLYNOMIAL;
  35. }
  36. dcdBitMask >>= 1;
  37. }
  38. }
  39. return uiCrcValue;
  40. }
  41. // 发送数据给下位机
  42. void rfid::sendData(QByteArray &sendData)
  43. {
  44. // qDebug() << "sendData: " << sendData.toHex();
  45. quint16 crc = uiCrc16Cal(sendData, sendData.size());
  46. // 输出CRC16校验和
  47. // qDebug() << "CRC16:" << QString::number(crc, 16).toUpper();
  48. sendData.prepend(0xFF);
  49. sendData.append((quint8)(crc >> 8));
  50. sendData.append((quint8)crc);
  51. qDebug() << "rfid-sendData: " << sendData.toHex();
  52. // 发送数据帧
  53. this->devserial->clear(QSerialPort::AllDirections);
  54. qint64 bytesWritten = this->devserial->write(sendData);
  55. if (bytesWritten == -1) {
  56. qWarning() << "Failed to write data:" << this->devserial->errorString();
  57. }
  58. // 刷新输出缓冲区
  59. // devserial->flush();
  60. // 等待数据写入完成
  61. if (!this->devserial->waitForBytesWritten(1000)) {
  62. qWarning() << "Timeout: Failed to write data within 5000 milliseconds.";
  63. }
  64. }
  65. // 读取下位机发来数据
  66. bool rfid::readData(QByteArray *data, quint16 timeout)
  67. {
  68. data->clear();
  69. while(this->devserial->waitForReadyRead(timeout))
  70. {
  71. *data += this->devserial->readAll();
  72. }
  73. qDebug() << "rfid-readData: " << data->size() << "," << data->toHex();
  74. if(data->size() == 0)
  75. {
  76. return false;
  77. }
  78. // 刷新输入缓冲区
  79. // devserial->flush();
  80. quint8 addr = data->at(0);
  81. if(addr == 0xFF)
  82. {
  83. QByteArray subData = data->mid(1, data->size() - 3);
  84. quint16 crc1 = uiCrc16Cal(subData, subData.size());
  85. quint16 crc2 = quint8(data->at(data->size() - 2));
  86. crc2 <<= 8;
  87. crc2 += quint8(data->at(data->size() - 1));
  88. if(crc1 == crc2)
  89. {
  90. return true;
  91. }
  92. }
  93. return false;
  94. }
  95. bool rfid::openSerial(void)
  96. {
  97. this->devserial->setPortName(pconfig->rfidPort); // 设定串口名称,根据你的系统修改
  98. this->devserial->setBaudRate(pconfig->rfidBaud);
  99. this->devserial->setDataBits(QSerialPort::Data8);
  100. this->devserial->setParity(QSerialPort::NoParity);
  101. this->devserial->setStopBits(QSerialPort::OneStop);
  102. this->devserial->setFlowControl(QSerialPort::NoFlowControl);
  103. // this->devserial->setTextModeEnabled(true);
  104. if (this->devserial->open(QIODevice::ReadWrite)) {
  105. qDebug() << "RFID串口打开成功";
  106. this->devserial->setReadBufferSize(0);
  107. msleep(1000);
  108. //信号与槽函数关联
  109. // connect(devserial, &QSerialPort::readyRead, this, &uart::slot_uartReadData);
  110. return true;
  111. }
  112. return false;
  113. }
  114. void rfid::slot_uartinfo_change(void)
  115. {
  116. if(openPort == true)
  117. {
  118. this->devserial->close();
  119. openPort = false;
  120. workstat = readerWorkStat::init;
  121. }
  122. }
  123. void rfid::slot_start_read_tid(void)
  124. {
  125. m_user = QVariant();
  126. if(workstat == readerWorkStat::sleep)
  127. {
  128. workstat = readerWorkStat::startreadtid;
  129. }
  130. }
  131. void rfid::slot_start_read_tid_Ex(const QVariant &user)
  132. {
  133. m_user = user;
  134. }
  135. void rfid::getReadType(void)
  136. {
  137. quint8 dataArray[] = {0x00, 0x04};
  138. QByteArray ba(reinterpret_cast<char*>(dataArray), sizeof(dataArray));
  139. this->sendData(ba);
  140. QByteArray data;
  141. if(true == readData(&data, 100))
  142. {
  143. workstat = readerWorkStat::setant;
  144. }
  145. }
  146. // void rfid::setAnt(void)
  147. // {
  148. // quint8 dataArray[] = {0x0D, 0x91, 0x02, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06};
  149. // QByteArray ba(reinterpret_cast<char*>(dataArray), sizeof(dataArray));
  150. // this->sendData(ba);
  151. // QByteArray data;
  152. // if(true == readData(&data, 1000))
  153. // {
  154. // workstat = readerWorkStat::setpower;
  155. // }
  156. // }
  157. // void rfid::setPower(void)
  158. // {
  159. // quint8 dataArray[] = {0x2B, 0x91, 0x04,
  160. // 0x01, (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  161. // (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  162. // (quint8)(pconfig->rfidSetTime >> 8), (quint8)(pconfig->rfidSetTime),
  163. // 0x02, (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  164. // (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  165. // (quint8)(pconfig->rfidSetTime >> 8), (quint8)(pconfig->rfidSetTime),
  166. // 0x03, (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  167. // (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  168. // (quint8)(pconfig->rfidSetTime >> 8), (quint8)(pconfig->rfidSetTime),
  169. // 0x04, (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  170. // (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  171. // (quint8)(pconfig->rfidSetTime >> 8), (quint8)(pconfig->rfidSetTime),
  172. // 0x05, (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  173. // (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  174. // (quint8)(pconfig->rfidSetTime >> 8), (quint8)(pconfig->rfidSetTime),
  175. // 0x06, (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  176. // (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  177. // (quint8)(pconfig->rfidSetTime >> 8), (quint8)(pconfig->rfidSetTime),
  178. // };
  179. // QByteArray ba(reinterpret_cast<char*>(dataArray), sizeof(dataArray));
  180. // this->sendData(ba);
  181. // QByteArray data;
  182. // if(true == readData(&data, 100))
  183. // {
  184. // workstat = readerWorkStat::startreadtid;
  185. // }
  186. // }
  187. void rfid::setAnt(void)
  188. {
  189. quint8 dataArray[] = {0x09, 0x91, 0x02, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04};
  190. QByteArray ba(reinterpret_cast<char*>(dataArray), sizeof(dataArray));
  191. this->sendData(ba);
  192. QByteArray data;
  193. if(true == readData(&data, 1000))
  194. {
  195. workstat = readerWorkStat::setpower;
  196. }
  197. }
  198. void rfid::setPower(void)
  199. {
  200. quint8 dataArray[] = {0x1D, 0x91, 0x04,
  201. 0x01, (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  202. (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  203. (quint8)(pconfig->rfidSetTime >> 8), (quint8)(pconfig->rfidSetTime),
  204. 0x02, (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  205. (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  206. (quint8)(pconfig->rfidSetTime >> 8), (quint8)(pconfig->rfidSetTime),
  207. 0x03, (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  208. (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  209. (quint8)(pconfig->rfidSetTime >> 8), (quint8)(pconfig->rfidSetTime),
  210. 0x04, (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  211. (quint8)(pconfig->rfidPower >> 8), (quint8)(pconfig->rfidPower),
  212. (quint8)(pconfig->rfidSetTime >> 8), (quint8)(pconfig->rfidSetTime),
  213. };
  214. QByteArray ba(reinterpret_cast<char*>(dataArray), sizeof(dataArray));
  215. this->sendData(ba);
  216. QByteArray data;
  217. if(true == readData(&data, 100))
  218. {
  219. workstat = readerWorkStat::startreadtid;
  220. }
  221. }
  222. void rfid::setStartreadtid(void)
  223. {
  224. quint8 dataArray[] = {0x05, 0x22, 0x80, 0x00, 0x00, (quint8)((pconfig->rfidWorkTime - 500) >> 8), (quint8)(pconfig->rfidWorkTime - 500)};
  225. QByteArray ba(reinterpret_cast<char*>(dataArray), sizeof(dataArray));
  226. this->sendData(ba);
  227. tidList.clear();
  228. QByteArray data;
  229. msleep(pconfig->rfidWorkTime);
  230. while(this->devserial->waitForReadyRead(100))
  231. {
  232. data += this->devserial->readAll();
  233. }
  234. if(data.size() > 0)
  235. {
  236. int size = data.size();
  237. qDebug() << "rfid-readData: " << size << "," << data.toHex();
  238. if(size > 0)
  239. {
  240. if((quint8)(data.at(0)) != 0xFF)
  241. {
  242. return;
  243. }
  244. quint8 dataSize = data.at(1);
  245. QByteArray subData = data.mid(1, dataSize + 4);
  246. quint16 crc1 = uiCrc16Cal(subData, subData.size());
  247. quint16 crc2 = quint8(data.at(dataSize + 5));
  248. crc2 <<= 8;
  249. crc2 += quint8(data.at(dataSize + 6));
  250. if(crc1 != crc2)
  251. {
  252. return;
  253. }
  254. if((quint8)(subData.at(1)) != 0x22
  255. || (quint8)(subData.at(2)) != 0x00
  256. || (quint8)(subData.at(3)) != 0x00
  257. || (quint8)(subData.at(4)) != 0x80
  258. )
  259. {
  260. return;
  261. }
  262. quint16 flags = quint8(subData.at(5));
  263. tidCount <<= 8;
  264. tidCount += quint8(subData.at(6));
  265. if((flags & 0x0010) == 0x0010)
  266. {
  267. if(dataSize == 7)
  268. {
  269. tidCount = quint8(subData.at(7));
  270. tidCount <<= 8;
  271. tidCount += quint8(subData.at(8));
  272. tidCount <<= 8;
  273. tidCount += quint8(subData.at(9));
  274. tidCount <<= 8;
  275. tidCount += quint8(subData.at(10));
  276. }
  277. else{
  278. return;
  279. }
  280. }
  281. else{
  282. tidCount = quint8(subData.at(7));
  283. }
  284. qDebug()<<"tid count is "<<tidCount;
  285. if(tidCount > 0)
  286. {
  287. workstat = readerWorkStat::readid;
  288. }
  289. else{
  290. if (m_user.isNull())
  291. {
  292. emit signal_tid_update(0, tidList);
  293. }
  294. else
  295. {
  296. emit signal_tid_update_Ex(0, tidList, m_user);
  297. }
  298. workstat = readerWorkStat::sleep;
  299. }
  300. }
  301. }
  302. }
  303. void rfid::readTid(void)
  304. {
  305. quint8 dataArray[] = {0x03, 0x29, 0x00, 0x07, 0x00};
  306. quint32 m_tidCount = tidCount;
  307. while (m_tidCount > 0)
  308. {
  309. QByteArray ba(reinterpret_cast<char*>(dataArray), sizeof(dataArray));
  310. this->sendData(ba);
  311. QByteArray data;
  312. while(this->devserial->waitForReadyRead(100))
  313. {
  314. data += this->devserial->readAll();
  315. }
  316. if(data.size() > 0)
  317. {
  318. int size = data.size();
  319. qDebug() << "rfid-readData: " << size << "," << data.toHex();
  320. if(size > 0)
  321. {
  322. if((quint8)(data.at(0)) != 0xFF)
  323. {
  324. return;
  325. }
  326. quint8 dataSize = data.at(1);
  327. QByteArray subData = data.mid(1, dataSize + 4);
  328. quint16 crc1 = uiCrc16Cal(subData, subData.size());
  329. quint16 crc2 = quint8(data.at(dataSize + 5));
  330. crc2 <<= 8;
  331. crc2 += quint8(data.at(dataSize + 6));
  332. if(crc1 != crc2)
  333. {
  334. return;
  335. }
  336. if((quint8)(subData.at(1)) != 0x29
  337. || (quint8)(subData.at(2)) != 0x00
  338. || (quint8)(subData.at(3)) != 0x00
  339. || (quint8)(subData.at(4)) != 0x00
  340. || (quint8)(subData.at(5)) != 0x07
  341. || (quint8)(subData.at(6)) != 0x00
  342. )
  343. {
  344. return;
  345. }
  346. quint8 idx = 8;
  347. quint8 count = (quint8)(subData.at(7));
  348. m_tidCount = (m_tidCount > count)?(m_tidCount - count):0;
  349. while(count--)
  350. {
  351. quint8 readCount = (quint8)(subData.at(idx++));
  352. qint8 rssi = (qint8)(subData.at(idx++));
  353. quint8 ant_id = (quint8)(subData.at(idx++));
  354. idx = idx + 4;
  355. QByteArray epcbyte = subData.mid(idx, 12);
  356. QString epc = epcbyte.toHex().toUpper();
  357. idx = idx + 14;
  358. if(!tidList.contains(epc))
  359. {
  360. qDebug() << "EPC=" << epc << "," << readCount << "," << rssi << "," << ant_id;
  361. tidList.append(epc);
  362. }
  363. }
  364. }
  365. }
  366. }
  367. signal_tid_update(tidCount, tidList);
  368. workstat = readerWorkStat::sleep;
  369. }
  370. void rfid::run()
  371. {
  372. this->devserial = new QSerialPort;
  373. while(this->threadstatus)
  374. {
  375. if(pconfig->rfidInit == true)
  376. {
  377. if(openPort == false)
  378. {
  379. openPort = this->openSerial();
  380. }
  381. else{
  382. switch(workstat)
  383. {
  384. case readerWorkStat::init:getReadType();break;
  385. case readerWorkStat::setant:setAnt();break;
  386. case readerWorkStat::setpower:setPower();break;
  387. case readerWorkStat::startreadtid:setStartreadtid();break;
  388. case readerWorkStat::readid:readTid();break;
  389. }
  390. }
  391. }
  392. msleep(20);
  393. }
  394. if(openPort == true)
  395. {
  396. this->devserial->close();
  397. }
  398. qDebug() << "rfid thread exit!";
  399. }