Qt 串口/网口数据收发线程示例代码 - 使用 QThread
在 Qt 中,可以使用 "QThread" 类来创建一个线程,并通过重写其 "run()" 函数来实现串口或网口的数据收发。下面是一个示例代码,用于在一个新线程中收发串口数据:
#include <QCoreApplication>
#include <QThread>
#include <QtSerialPort/QSerialPort>
#include <QDebug>
class SerialThread : public QThread
{
Q_OBJECT
public:
explicit SerialThread(QObject *parent = nullptr)
: QThread(parent)
{
// 在构造函数中初始化串口对象
serial = new QSerialPort(this);
connect(serial, &QSerialPort::readyRead, this, &SerialThread::readData);
}
void run() override
{
// 打开串口
serial->setPortName(\"COM1\"); // 设置串口号
serial->setBaudRate(QSerialPort::Baud9600); // 设置波特率
serial->setDataBits(QSerialPort::Data8); // 设置数据位
serial->setParity(QSerialPort::NoParity); // 设置校验位
serial->setStopBits(QSerialPort::OneStop); // 设置停止位
serial->setFlowControl(QSerialPort::NoFlowControl); // 设置流控制
if (!serial->open(QIODevice::ReadWrite))
{
qDebug() << \"Failed to open serial port!\";
return;
}
// 循环读取串口数据
while (!isInterruptionRequested())
{
if (serial->waitForReadyRead(100))
{
QByteArray data = serial->readAll();
// 处理收到的数据,例如发送到其他线程进行处理
emit dataReceived(data);
}
}
// 关闭串口
serial->close();
}
signals:
void dataReceived(const QByteArray& data);
private:
QSerialPort *serial;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
SerialThread serialThread;
QObject::connect(&serialThread, &SerialThread::dataReceived, [](const QByteArray& data){
qDebug() << \"Received data:\" << data;
});
serialThread.start();
return a.exec();
}
在上面的代码中,"SerialThread" 类继承自 "QThread",并重写了其 "run()" 函数。在 "run()" 函数中,首先通过 "QSerialPort" 类打开串口,然后循环读取串口数据。当串口有数据可读时,通过 "readAll()" 函数读取数据,并通过信号 "dataReceived()" 发送给其他线程进行处理。
在 "main()" 函数中,创建了一个 "SerialThread" 对象,并通过连接信号槽的方式将收到的数据打印出来。最后通过调用 "start()" 函数启动线程。
需要注意的是,在 Qt 中,不建议直接继承 "QThread" 类,而是通过创建一个 "QObject" 子类,并将其移动到一个新线程中来实现多线程。上面的示例代码仅为演示目的,实际使用时建议参考 Qt 官方文档中关于多线程编程的最佳实践。
原文地址: https://www.cveoy.top/t/topic/pIsy 著作权归作者所有。请勿转载和采集!