Qt5多线程串口收发数据

Qt5 多线程串口收发数据

有需要用串口接收大量数据,但是放在主线程又会使界面卡顿,这个时候就需要使用多线程来接收数据。

多线程的使用教程可以查看我之前写的蹩脚教程:QT 线程 QThread
串口的使用教程也可以看:QT 串口通讯

### 使用QThread进行多线程串口通信数据收发 #### 创建线程类并继承`QThread` 为了实现多线程下的串口数据收发,在Qt中可以通过创建一个新的类来继承`QThread`,并在该类中重写`run()`函数[^2]。 ```cpp class SerialPortThread : public QThread { Q_OBJECT public: explicit SerialPortThread(QObject *parent = nullptr); protected: void run() override; }; ``` 此代码片段定义了一个名为`SerialPortThread`的新类,它从`QThread`派生而来,并声明了需要覆盖的成员函数`run()`。这使得可以在新启动的线程内执行特定的任务逻辑。 #### 初始化与配置串口设置 在实际应用之前,还需要初始化和配置好串口号、波特率等参数: ```cpp #include <QSerialPort> // 构造函数内部 explicit SerialPortThread::SerialPortThread(QObject *parent) : QThread(parent), serial(new QSerialPort(this)) { connect(serial, &QSerialPort::readyRead, this, &SerialPortThread::handleReadyRead); // 设置串口名称和其他属性... } ``` 这引入了`QSerialPort`库用于管理物理层面上的连接细节。同时建立了信号槽机制以便当接到新的输入时触发相应的处理过程[^1]。 #### 实现数据发送与接 对于数据传输而言,则是在`run()`方法完成主要工作流程——既可以是持续监听端口状态变化从而读取传入的信息包;也可以主动向目标设备发出请求命令字符串等等操作。 ```cpp void SerialPortThread::run() { if (!serial->open(QIODevice::ReadWrite)) return; while(!isInterruptionRequested()) { // 循环直到被中断为止 QByteArray data; // 存储待发送的消息体 // 发送消息给对方 serial->write(data); // 向外设发送指令或文件流等内容 msleep(500); // 延迟一段时间再继续尝试获取反馈结果 // 接受来自外部硬件返回的结果集 handleReadyRead(); // 调用自定义的方法解析已到达的数据帧结构 } serial->close(); } ``` 上述伪代码展示了如何在一个无限循环体内交替地执行写入动作以及调用专门负责解释所获得报文含义的服务例程[^4]。 #### 安全终止线程运行 最后一点需要注意的是应当提供一种安全的方式让工作者能够退出当前的工作周期而不至于造成资源泄露等问题发生: ```cpp void SerialPortThread::stop() { requestInterruption(); quit(); wait(); } ``` 通过调用`requestInterruption()`可以优雅地中止正在进行中的任务序列,随后利用`quit()`结束事件循环并且等待所有活动都完成后才真正释放掉占用的空间[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值