serialport.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. #include "serialport.h"
  2. #include <QtDebug>
  3. #include <QSignalSpy>
  4. SerialPort::SerialPort(QObject *parent) : QObject(parent)
  5. {
  6. //m_serial = new QSerialPort;
  7. //connect(this,&SerialUi::sendConnect,mSerialPort,&SerialPort::receiveConnect);
  8. // connect(this,&SerialPort::sendOk,this,&SerialPort::recieveData);
  9. // connect(m_serial,&QSerialPort::readyRead,this,&SerialPort::recieveData);
  10. }
  11. void SerialPort::receiveInit()
  12. {
  13. m_serial = new QSerialPort;
  14. }
  15. void SerialPort::recieveData()
  16. {
  17. // qDebug()<<"recieveData";
  18. // QByteArray responseData = m_serial->readAll();
  19. // qDebug()<<responseData;
  20. // emit sendReceiveData(responseData);
  21. // //read response
  22. // if (m_serial->waitForReadyRead(3000)) {
  23. // qDebug()<<"have data";
  24. // QByteArray responseData = m_serial->readAll();
  25. // while (m_serial->waitForReadyRead(100))
  26. // responseData += m_serial->readAll();
  27. // qDebug()<<responseData;
  28. // emit sendReceiveData(responseData);
  29. // }
  30. // else{
  31. // qDebug()<<"timeout";
  32. // }
  33. }
  34. void SerialPort::crcCheck(uint8_t *data, int length, uint8_t *crc_h, uint8_t *crc_l)
  35. {
  36. int j;
  37. uint16_t reg_crc=0xFFFF;
  38. while(length--)
  39. {
  40. reg_crc ^= *data++;
  41. for(j=0;j<8;j++)
  42. {
  43. if(reg_crc & 0x01) /* LSB(b0)=1 */
  44. reg_crc=(reg_crc>>1) ^ 0xA001;
  45. else
  46. reg_crc=reg_crc >>1;
  47. }
  48. }
  49. *crc_h = (reg_crc>>8)&0x00ff;
  50. *crc_l = reg_crc&0x00ff;
  51. }
  52. SerialPort::~SerialPort()
  53. {
  54. if(m_serial->isOpen())
  55. {
  56. m_serial->clear();
  57. m_serial->close();
  58. }
  59. m_serial->deleteLater();
  60. }
  61. bool SerialPort::serialConnect(QString port, QString baudrate, QString databits, QString parity, QString stopbits)
  62. {
  63. m_serial->setPortName(port);
  64. if(!m_serial->open(QIODevice::ReadWrite))
  65. {
  66. qDebug()<<"Open" +port+" Error";
  67. return false;
  68. }
  69. switch (baudrate.toInt()) {
  70. case 4800:
  71. m_serial->setBaudRate(QSerialPort::Baud4800);
  72. break;
  73. case 9600:
  74. m_serial->setBaudRate(QSerialPort::Baud9600);
  75. break;
  76. case 115200:
  77. m_serial->setBaudRate(QSerialPort::Baud115200);
  78. break;
  79. default:
  80. qDebug("BaudRate Error");
  81. return false;
  82. }
  83. switch (databits.toInt()) {
  84. case 6:
  85. m_serial->setDataBits(QSerialPort::Data6);
  86. break;
  87. case 7:
  88. m_serial->setDataBits(QSerialPort::Data7);
  89. break;
  90. case 8:
  91. m_serial->setDataBits(QSerialPort::Data8);
  92. break;
  93. default:
  94. qDebug("DataBits Error");
  95. return 0;
  96. }
  97. //model: ["NONE","ODD","EVEN"] 0 1 2
  98. switch (parity.toInt()) {
  99. case 0:
  100. m_serial->setParity(QSerialPort::NoParity); //Check digit is set to 0
  101. qDebug("parity = NONE");
  102. break;
  103. case 2:
  104. m_serial->setParity(QSerialPort::EvenParity);
  105. qDebug("parity = EVEN");
  106. break;
  107. case 1:
  108. m_serial->setParity(QSerialPort::OddParity);
  109. qDebug("parity = ODD");
  110. break;
  111. default:
  112. qDebug("Parity Error");
  113. return 0;
  114. }
  115. switch (stopbits.toInt()) {
  116. case 1:
  117. m_serial->setStopBits(QSerialPort::OneStop); //Stop bit is set to 1
  118. break;
  119. case 2:
  120. m_serial->setStopBits(QSerialPort::TwoStop);
  121. break;
  122. case 3:
  123. m_serial->setStopBits(QSerialPort::OneAndHalfStop);
  124. break;
  125. default:
  126. printf("StopBits Error");
  127. return 0;
  128. }
  129. m_serial->setFlowControl(QSerialPort::NoFlowControl);//Set to no flow control
  130. return true;
  131. }
  132. void SerialPort::closeConnect()
  133. {
  134. if(m_serial->isOpen())
  135. {
  136. m_serial->clear();
  137. m_serial->close();
  138. }
  139. // m_serial->deleteLater();
  140. }
  141. bool SerialPort::serialWriteReponse(QString sendStr)
  142. {
  143. // if(m_serial->isOpen() == false)
  144. // return false;
  145. // QByteArray responseData;
  146. // responseData.clear();
  147. // m_serial->readAll(); //clear buffer
  148. // QStringList strList = sendStr.split(" ");
  149. // strList.removeAll("");
  150. // if(strList.length() == 0)
  151. // return 0;
  152. // char *sendData = (char *) malloc(128);
  153. // int cnt=0;
  154. // QStringListIterator strIterator(strList);
  155. // while (strIterator.hasNext()){
  156. // QString str = strIterator.next();
  157. // char value = str.toInt(nullptr, 16);
  158. // sendData[cnt++] = value;
  159. // }
  160. // uint8_t crc_h;
  161. // uint8_t crc_l;
  162. // crcCheck((uint8_t *)sendData, cnt, &crc_h, &crc_l);
  163. // sendData[cnt++] = crc_l;
  164. // sendData[cnt++] = crc_h;
  165. // m_serial->write(sendData,cnt);
  166. // QSignalSpy spy(m_serial, SIGNAL(readyRead()));
  167. // bool ret = spy.wait(500);
  168. // if(ret == true){
  169. // QByteArray responseData = m_serial->readAll();
  170. // while (spy.wait(10) == true){
  171. // responseData += m_serial->readAll();
  172. // }
  173. // if(responseData.length() > 2){
  174. // for(int i=0 ;i<responseData.length(); i++){
  175. // uint8_t value = responseData.at(i);
  176. // sendData[i] = value;
  177. // }
  178. // crcCheck((uint8_t *)sendData, responseData.length(), &crc_h, &crc_l);
  179. // if(crc_h !=0 || crc_l !=0 ){
  180. // qDebug()<<"crc error";
  181. // }
  182. // else{
  183. // emit sendReceiveData(responseData);
  184. // }
  185. // }
  186. // // emit sendReceiveData(responseData);
  187. // }
  188. // else{
  189. // qDebug()<<"time out";
  190. // }
  191. // free(sendData);
  192. return 1;
  193. }
  194. QList<int> SerialPort::serialRead()
  195. {
  196. return mData;
  197. }
  198. bool SerialPort::getOpenStatus()
  199. {
  200. return m_serial->isOpen();
  201. }
  202. bool SerialPort::serialWrite(QString sendStr)
  203. {
  204. m_serial->write(sendStr.toLatin1().data(),strlen(sendStr.toLatin1().data()));
  205. return 1;
  206. }
  207. void SerialPort::receiveConnect(QString port, QString baudrate, QString databits, QString parity, QString stopbits)
  208. {
  209. bool status = serialConnect( port, baudrate, databits, parity, stopbits);
  210. emit sendPortStatus(status);
  211. }
  212. void SerialPort::receiveOnlyWrite(QString sendStr)
  213. {
  214. //延时用 没其他意义 把队列内容 依次发出
  215. QSignalSpy spy(m_serial, SIGNAL(readChannelFinished()));
  216. spy.wait(300);
  217. if(m_serial->isOpen() == false){
  218. return ;
  219. }
  220. qDebug()<<sendStr;
  221. QStringList strList = sendStr.split(" ");
  222. strList.removeAll("");
  223. char sendData[128];
  224. int cnt=0;
  225. QStringListIterator strIterator(strList);
  226. while (strIterator.hasNext()){
  227. QString str = strIterator.next();
  228. char value = str.toInt(nullptr, 16);
  229. sendData[cnt++] = value;
  230. }
  231. uint8_t crc_h;
  232. uint8_t crc_l;
  233. crcCheck((uint8_t *)sendData, cnt, &crc_h, &crc_l);
  234. sendData[cnt++] = crc_l;
  235. sendData[cnt++] = crc_h;
  236. int retryCnt=0;
  237. retry:
  238. m_serial->readAll();
  239. m_serial->write(sendData,cnt);
  240. m_serial->waitForBytesWritten(1000);
  241. QSignalSpy spy1(m_serial, SIGNAL(readyRead()));
  242. bool ret = spy1.wait(300);
  243. if(ret == true){
  244. qDebug()<<"get response";
  245. QByteArray responseData = m_serial->readAll();
  246. qDebug()<<responseData;
  247. }
  248. else{
  249. qDebug()<<"get timeout";
  250. QByteArray responseData = m_serial->readAll();
  251. qDebug()<<responseData;
  252. retryCnt++;
  253. if(retryCnt > 2)
  254. return;
  255. goto retry;
  256. }
  257. }
  258. void SerialPort::receiveWrite(QString sendStr)
  259. {
  260. // qDebug() << QThread::currentThreadId() << "SerialPort";
  261. // QList<int> data;
  262. // qDebug()<<m_serial->portName()<<":";
  263. // qDebug()<<sendStr;
  264. mData.clear();
  265. QByteArray responseData;
  266. responseData.clear();
  267. if(m_serial->isOpen() == false){
  268. sendReceiveData();
  269. return ;
  270. }
  271. QByteArray response = m_serial->readAll(); //clear buffer
  272. if(response.length() > 0){
  273. qDebug()<< "may be lost data";
  274. }
  275. QStringList strList = sendStr.split(" ");
  276. strList.removeAll("");
  277. if(strList.length() == 0){
  278. return ;
  279. }
  280. char sendData[128];
  281. char receivedData[128];
  282. int cnt=0;
  283. QStringListIterator strIterator(strList);
  284. while (strIterator.hasNext()){
  285. QString str = strIterator.next();
  286. char value = str.toInt(nullptr, 16);
  287. sendData[cnt++] = value;
  288. }
  289. uint8_t crc_h;
  290. uint8_t crc_l;
  291. crcCheck((uint8_t *)sendData, cnt, &crc_h, &crc_l);
  292. sendData[cnt++] = crc_l;
  293. sendData[cnt++] = crc_h;
  294. m_serial->write(sendData,cnt);
  295. m_serial->waitForBytesWritten(200);
  296. // QByteArray tx_buf;
  297. // tx_buf.append(sendData, cnt);
  298. // qDebug() << "receiveWrite tx_buf: " << tx_buf.toHex();
  299. QSignalSpy spy(m_serial, SIGNAL(readyRead()));
  300. bool ret = spy.wait(600);
  301. if(ret == true){
  302. QByteArray responseData = m_serial->readAll();
  303. while (spy.wait(30) == true){
  304. responseData += m_serial->readAll();
  305. }
  306. //qDebug() << "receiveWrite rxbuf: " << responseData.toHex();
  307. if(responseData.length() > 2){
  308. for(int i=0 ;i<responseData.length(); i++){
  309. uint8_t value = responseData.at(i);
  310. receivedData[i] = value;
  311. mData.append(value);
  312. }
  313. crcCheck((uint8_t *)receivedData, responseData.length(), &crc_h, &crc_l);
  314. if(crc_h !=0 || crc_l !=0 ){
  315. mData.clear();
  316. qDebug()<<"modbus crc error";
  317. emit sendCrcError();
  318. }
  319. }
  320. }
  321. else{
  322. qDebug()<<"modbus time out";
  323. emit sendTimeout();
  324. }
  325. sendReceiveData();
  326. }
  327. void SerialPort::reveiveClose()
  328. {
  329. closeConnect();
  330. }