#include "serialport.h" #include #include SerialPort::SerialPort(QObject *parent) : QObject(parent) { //m_serial = new QSerialPort; //connect(this,&SerialUi::sendConnect,mSerialPort,&SerialPort::receiveConnect); // connect(this,&SerialPort::sendOk,this,&SerialPort::recieveData); // connect(m_serial,&QSerialPort::readyRead,this,&SerialPort::recieveData); } void SerialPort::receiveInit() { m_serial = new QSerialPort; //connect(m_serial,&QSerialPort::readyRead,this,&SerialPort::recieveData); } #if 0 void SerialPort::recieveData() { mData.clear(); //QSignalSpy spy(m_serial, SIGNAL(readyRead())); //bool ret = spy.wait(600); //if(ret == true){ mData = m_serial->readAll(); //while (1){ QThread::msleep(30); mData += m_serial->readAll(); qDebug()<<"modbus received data length is : "<< mData.length(); //} // } // else{ // qDebug()<<"modbus time out"; // emit sendTimeout(); // } sendReceiveData(); } void SerialPort::crcCheck(uint8_t *data, int length, uint8_t *crc_h, uint8_t *crc_l) { int j; uint16_t reg_crc=0xFFFF; while(length--) { reg_crc ^= *data++; for(j=0;j<8;j++) { if(reg_crc & 0x01) /* LSB(b0)=1 */ reg_crc=(reg_crc>>1) ^ 0xA001; else reg_crc=reg_crc >>1; } } *crc_h = (reg_crc>>8)&0x00ff; *crc_l = reg_crc&0x00ff; } #endif SerialPort::~SerialPort() { if(m_serial->isOpen()) { m_serial->clear(); m_serial->close(); } m_serial->deleteLater(); } bool SerialPort::serialConnect(QString port, QString baudrate, QString databits, QString parity, QString stopbits) { m_serial->setPortName(port); if(!m_serial->open(QIODevice::ReadWrite)) { qDebug()<<"Open" +port+" Error"; return false; } switch (baudrate.toInt()) { case 4800: m_serial->setBaudRate(QSerialPort::Baud4800); break; case 9600: m_serial->setBaudRate(QSerialPort::Baud9600); break; case 115200: m_serial->setBaudRate(QSerialPort::Baud115200); break; default: qDebug("BaudRate Error"); return false; } switch (databits.toInt()) { case 6: m_serial->setDataBits(QSerialPort::Data6); break; case 7: m_serial->setDataBits(QSerialPort::Data7); break; case 8: m_serial->setDataBits(QSerialPort::Data8); break; default: qDebug("DataBits Error"); return 0; } //model: ["NONE","ODD","EVEN"] 0 1 2 switch (parity.toInt()) { case 0: m_serial->setParity(QSerialPort::NoParity); //Check digit is set to 0 qDebug("parity = NONE"); break; case 2: m_serial->setParity(QSerialPort::EvenParity); qDebug("parity = EVEN"); break; case 1: m_serial->setParity(QSerialPort::OddParity); qDebug("parity = ODD"); break; default: qDebug("Parity Error"); return 0; } switch (stopbits.toInt()) { case 1: m_serial->setStopBits(QSerialPort::OneStop); //Stop bit is set to 1 break; case 2: m_serial->setStopBits(QSerialPort::TwoStop); break; case 3: m_serial->setStopBits(QSerialPort::OneAndHalfStop); break; default: printf("StopBits Error"); return 0; } m_serial->setFlowControl(QSerialPort::NoFlowControl);//Set to no flow control return true; } void SerialPort::closeConnect() { if(m_serial->isOpen()) { m_serial->clear(); m_serial->close(); } // m_serial->deleteLater(); } /* bool SerialPort::serialWriteReponse(QString sendStr) { // if(m_serial->isOpen() == false) // return false; // QByteArray responseData; // responseData.clear(); // m_serial->readAll(); //clear buffer // QStringList strList = sendStr.split(" "); // strList.removeAll(""); // if(strList.length() == 0) // return 0; // char *sendData = (char *) malloc(128); // int cnt=0; // QStringListIterator strIterator(strList); // while (strIterator.hasNext()){ // QString str = strIterator.next(); // char value = str.toInt(nullptr, 16); // sendData[cnt++] = value; // } // uint8_t crc_h; // uint8_t crc_l; // crcCheck((uint8_t *)sendData, cnt, &crc_h, &crc_l); // sendData[cnt++] = crc_l; // sendData[cnt++] = crc_h; // m_serial->write(sendData,cnt); // QSignalSpy spy(m_serial, SIGNAL(readyRead())); // bool ret = spy.wait(500); // if(ret == true){ // QByteArray responseData = m_serial->readAll(); // while (spy.wait(10) == true){ // responseData += m_serial->readAll(); // } // if(responseData.length() > 2){ // for(int i=0 ;iisOpen(); } /* bool SerialPort::serialWrite(QString sendStr) { m_serial->write(sendStr.toLatin1().data(),strlen(sendStr.toLatin1().data())); return 1; } */ void SerialPort::receiveConnect(QString port, QString baudrate, QString databits, QString parity, QString stopbits) { bool status = serialConnect( port, baudrate, databits, parity, stopbits); emit sendPortStatus(status); } void SerialPort::receiveOnlyWrite(QByteArray sendData) { //延时用 没其他意义 把队列内容 依次发出 QSignalSpy spy(m_serial, SIGNAL(readChannelFinished())); spy.wait(300); if(m_serial->isOpen() == false){ return ; } int retryCnt=0; retry: m_serial->readAll(); m_serial->write(sendData); m_serial->waitForBytesWritten(1000); QSignalSpy spy1(m_serial, SIGNAL(readyRead())); bool ret = spy1.wait(300); if(ret == true){ qDebug()<<"get response"; QByteArray responseData = m_serial->readAll(); qDebug()<readAll(); qDebug()< 2) return; goto retry; } } void SerialPort::receiveWrite(QByteArray sendData) { // qDebug() << QThread::currentThreadId() << "SerialPort"; // QList data; //qDebug()<isOpen() == false){ sendReceiveData(); return ; } QByteArray response = m_serial->readAll(); //clear buffer if(response.length() > 0){ qDebug()<< "may be lost data"; } m_serial->write(sendData); m_serial->waitForBytesWritten(200); #if 1 QSignalSpy spy(m_serial, SIGNAL(readyRead())); bool ret = spy.wait(300); if(ret == true){ mData = m_serial->readAll(); while (spy.wait(30) == true){ mData += m_serial->readAll(); } } else{ qDebug()<<"modbus time out"; emit sendTimeout(); } sendReceiveData(); #endif } void SerialPort::reveiveClose() { closeConnect(); }