使用的关键点是要在 run() 里面创建事件循环,且 QSerialPort 要在 run() 里面初始化
// serial_thread.h
#ifndef SERIALTHREAD_H
#define SERIALTHREAD_H
#include <QObject>
#include <QThread>
#include <QtSerialPort>
#define MDEBUG qDebug() << QThread::currentThreadId() << __FUNCTION__ << __LINE__
class SerialThread : public QThread
{
Q_OBJECT
public:
SerialThread();
void run() override;
QSerialPort* serial;
};
#endif // SERIALTHREAD_H
// serial_thread.cpp
#include "serial_thread.h"
SerialThread::SerialThread()
{
MDEBUG;
}
void SerialThread::run()
{
//设置串口名
serial = new QSerialPort();
serial->setPortName("COM1");
//设置波特率
serial->setBaudRate(QSerialPort::Baud9600);
//设置数据位数
serial->setDataBits(QSerialPort::Data8);
//设置奇偶校验
serial->setParity(QSerialPort::NoParity);
//设置停止位
serial->setStopBits(QSerialPort::OneStop);
//设置流控制
serial->setFlowControl(QSerialPort::NoFlowControl);
//打开串口
serial->open(QIODevice::ReadWrite);
serial->write("ABCDEFGH");
QEventLoop loop; // 非常重要, 没有事件循环数据无法发送
QTimer::singleShot(1, &loop, SLOT(quit()));
loop.exec();
while (true) { // 每秒定时发送
serial->write("AB");
emit msgEvent();
QEventLoop loop; // 非常重要, 没有事件循环数据无法发送
QTimer::singleShot(1000, &loop, SLOT(quit()));
loop.exec();
MDEBUG << QDateTime::currentDateTime().toString("hh:mm:ss");
}
}