serialport.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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. SerialPort::~SerialPort()
  17. {
  18. qDebug()<<"SerialPort destory";
  19. if(m_serial->isOpen())
  20. {
  21. m_serial->clear();
  22. m_serial->close();
  23. }
  24. m_serial->deleteLater();
  25. }
  26. bool SerialPort::serialConnect(QString port, QString baudrate, QString databits, QString parity, QString stopbits)
  27. {
  28. m_serial->setPortName(port);
  29. if(!m_serial->open(QIODevice::ReadWrite))
  30. {
  31. qDebug()<<"Open" +port+" Error";
  32. return false;
  33. }
  34. switch (baudrate.toInt()) {
  35. case 4800:
  36. m_serial->setBaudRate(QSerialPort::Baud4800);
  37. break;
  38. case 9600:
  39. m_serial->setBaudRate(QSerialPort::Baud9600);
  40. break;
  41. case 115200:
  42. m_serial->setBaudRate(QSerialPort::Baud115200);
  43. break;
  44. default:
  45. qDebug("BaudRate Error");
  46. return false;
  47. }
  48. switch (databits.toInt()) {
  49. case 6:
  50. m_serial->setDataBits(QSerialPort::Data6);
  51. break;
  52. case 7:
  53. m_serial->setDataBits(QSerialPort::Data7);
  54. break;
  55. case 8:
  56. m_serial->setDataBits(QSerialPort::Data8);
  57. break;
  58. default:
  59. qDebug("DataBits Error");
  60. return 0;
  61. }
  62. //model: ["NONE","ODD","EVEN"] 0 1 2
  63. switch (parity.toInt()) {
  64. case 0:
  65. m_serial->setParity(QSerialPort::NoParity); //Check digit is set to 0
  66. qDebug("parity = NONE");
  67. break;
  68. case 2:
  69. m_serial->setParity(QSerialPort::EvenParity);
  70. qDebug("parity = EVEN");
  71. break;
  72. case 1:
  73. m_serial->setParity(QSerialPort::OddParity);
  74. qDebug("parity = ODD");
  75. break;
  76. default:
  77. qDebug("Parity Error");
  78. return 0;
  79. }
  80. switch (stopbits.toInt()) {
  81. case 1:
  82. m_serial->setStopBits(QSerialPort::OneStop); //Stop bit is set to 1
  83. break;
  84. case 2:
  85. m_serial->setStopBits(QSerialPort::TwoStop);
  86. break;
  87. case 3:
  88. m_serial->setStopBits(QSerialPort::OneAndHalfStop);
  89. break;
  90. default:
  91. printf("StopBits Error");
  92. return 0;
  93. }
  94. m_serial->setFlowControl(QSerialPort::NoFlowControl);//Set to no flow control
  95. return true;
  96. }
  97. void SerialPort::closeConnect()
  98. {
  99. qDebug()<<"SerialPort closeConnect";
  100. if(m_serial->isOpen())
  101. {
  102. m_serial->clear();
  103. m_serial->close();
  104. }
  105. // m_serial->deleteLater();
  106. }
  107. QByteArray SerialPort::serialRead()
  108. {
  109. return mData;
  110. }
  111. bool SerialPort::getOpenStatus()
  112. {
  113. return m_serial->isOpen();
  114. }
  115. /*
  116. bool SerialPort::serialWrite(QString sendStr)
  117. {
  118. m_serial->write(sendStr.toLatin1().data(),strlen(sendStr.toLatin1().data()));
  119. return 1;
  120. }
  121. */
  122. void SerialPort::receiveConnect(QString port, QString baudrate, QString databits, QString parity, QString stopbits)
  123. {
  124. bool status = serialConnect( port, baudrate, databits, parity, stopbits);
  125. emit sendPortStatus(status);
  126. }
  127. void SerialPort::receiveOnlyWrite(QByteArray sendData)
  128. {
  129. //延时用 没其他意义 把队列内容 依次发出
  130. QSignalSpy spy(m_serial, SIGNAL(readChannelFinished()));
  131. spy.wait(300);
  132. if(m_serial->isOpen() == false){
  133. return ;
  134. }
  135. int retryCnt=0;
  136. retry:
  137. m_serial->readAll();
  138. m_serial->write(sendData);
  139. m_serial->waitForBytesWritten(1000);
  140. QSignalSpy spy1(m_serial, SIGNAL(readyRead()));
  141. bool ret = spy1.wait(300);
  142. if(ret == true){
  143. qDebug()<<"get response";
  144. QByteArray responseData = m_serial->readAll();
  145. qDebug()<<responseData;
  146. }
  147. else{
  148. qDebug()<<"get timeout";
  149. QByteArray responseData = m_serial->readAll();
  150. qDebug()<<responseData;
  151. retryCnt++;
  152. if(retryCnt > 2)
  153. return;
  154. goto retry;
  155. }
  156. }
  157. void SerialPort::receiveWrite(QByteArray sendData)
  158. {
  159. mData.clear();
  160. if(m_serial->isOpen() == false){
  161. emit sendReceiveData();
  162. return ;
  163. }
  164. QByteArray response = m_serial->readAll(); //clear buffer
  165. if(response.length() > 0){
  166. qDebug()<< "may be lost data";
  167. }
  168. m_serial->write(sendData);
  169. m_serial->waitForBytesWritten(200);
  170. #if 1
  171. QSignalSpy spy(m_serial, SIGNAL(readyRead()));
  172. bool ret = spy.wait(300);
  173. if(ret == true){
  174. mData = m_serial->readAll();
  175. while (spy.wait(30) == true){
  176. mData += m_serial->readAll();
  177. }
  178. }
  179. else{
  180. //qDebug()<<"modbus time out";
  181. mData = m_serial->readAll();
  182. if(0 == mData.size()){
  183. qDebug()<<"modbus time out";
  184. emit sendTimeout();
  185. }
  186. }
  187. emit sendReceiveData();
  188. #endif
  189. }
  190. void SerialPort::reveiveClose()
  191. {
  192. closeConnect();
  193. }