天天看点

Qt串口多线程收发

#include "serialport.h"
#include "Configuration.h"
#include "global.h"
#include <QDebug>
#include <QThread>

SerialPort::SerialPort()
{
    isRun = true;
    this->setAutoDelete(true);
}

SerialPort::~SerialPort()
{
    if (serial){
        delete serial;
        serial = nullptr;
    }
    qDebug() << "~SerialPort";
}

void SerialPort::init()
{
    serial = new QSerialPort();
    //设置串口名
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        qDebug() <<"COM:"<< info.portName();
#ifdef Q_OS_WIN32
        QString portName = QString("COM%1").arg(COM::getPort());
#else
        QString portName = QString("ttyUSB%1").arg(COM::getPort());
#endif
        if (info.portName() == portName) {
            qDebug() <<"COM:find " << portName;
            serial->setPortName(info.portName());
        } else {
            qDebug() <<"COM:not find " << portName;
        }
    }
    //设置波特率
    serial->setBaudRate(COM::getBaudRate());
    //设置数据位数
    serial->setDataBits(QSerialPort::Data8);
    //设置奇偶校验
    serial->setParity(QSerialPort::NoParity);
    //设置停止位
    serial->setStopBits(QSerialPort::OneStop);
    //设置流控制
    serial->setFlowControl(QSerialPort::NoFlowControl);
}

void SerialPort::close()
{
    isRun = false;
}

void SerialPort::sendData(QByteArray data)
{
    sendMData = data;
    qDebug() <<"sendData:"<<sendMData.toHex();
}

void SerialPort::run()
{
    init();
    //读取数据
    while (isRun) {
        if (serial->isOpen()) {
            if(serial->waitForReadyRead(50)){
                QByteArray requestData = serial->readAll();
                GlobalData::addData(requestData);
            }
            if (sendMData != "") {
                serial->write(sendMData);
                if (serial->waitForBytesWritten(50)) {
                    sendMData = "";
                }
            }
        } else {
            QThread::msleep(3000);
            if(!serial->open(QIODevice::ReadWrite))
            {
                qDebug() <<"COM:open fail";
            }
        }
    }
}

           

继续阅读