serialport.cpp 7.7 KB

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