serialport.cpp 5.0 KB

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