使用QT在子线程中访问串口
在开发过程中遇到个串口读取问题记录如下。
PlaneDataHandleThread::PlaneDataHandleThread(QObject *parent) : QThread(parent) { } PlaneDataHandleThread::~PlaneDataHandleThread() { } void PlaneDataHandleThread::run() { qDebug() << "无人机线程"<<currentThreadId(); m_ser.setBaudRate(QSerialPort::Baud57600); m_ser.setDataBits(QSerialPort::Data8); m_ser.setParity(QSerialPort::NoParity); m_ser.setStopBits(QSerialPort::OneStop); m_ser.setFlowControl(QSerialPort::NoFlowControl); m_ser.setPortName("com3"); bool b = m_ser.open(QIODevice::ReadOnly); //connect(&m_ser, &QSerialPort::readyRead, this, &PlaneDataHandleThread::onDataReady); while (m_bRun) { qDebug() << m_ser.readAll(); } } //void PlaneDataHandleThread::onDataReady() //{ // qDebug() << m_ser.bytesAvailable() << endl; //} void PlaneDataHandleThread::connPlane() { m_bConnected = true; } void PlaneDataHandleThread::quit() { m_bRun = false; }
按正常理解这个地方会调试输出串口内容,实际上啥也输出不了,修改如下即可。
while (m_bRun) { m_ser.waitForReadyRead();//添加此代码后下面的代码就可以输出内容 qDebug() << m_ser.readAll(); }
也可以使用信号方式读取数据
void PlaneDataHandleThread::run() { qDebug() << "无人机线程"<<currentThreadId(); m_ser.setBaudRate(QSerialPort::Baud57600); m_ser.setDataBits(QSerialPort::Data8); m_ser.setParity(QSerialPort::NoParity); m_ser.setStopBits(QSerialPort::OneStop); m_ser.setFlowControl(QSerialPort::NoFlowControl); m_ser.setPortName("com3"); bool b = m_ser.open(QIODevice::ReadOnly); connect(&m_ser, &QSerialPort::readyRead, this, &PlaneDataHandleThread::onDataReady); while (m_bRun) { m_ser.waitForReadyRead(); } } void PlaneDataHandleThread::onDataReady() { qDebug() << m_ser.readAll() << endl; }