Qt 串口 QThread多线程

本文档详细介绍了如何在Qt环境中利用QThread实现串口通信的多线程收发。首先,创建了一个名为ComService的类,继承自QObject,处理串口操作。接着,通过QThread创建子线程,将ComService对象移动到该线程中,实现串口收发的异步处理。在主线程与子线程间通过信号和槽进行数据交互,确保了UI的实时更新和串口操作的独立性。最后,给出了包括mainwindow.h、mainwindow.cpp、comservice.h和comservice.cpp在内的完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt 串口 QThread多线程-节二QThread收发


前文提要:节一介绍了Qt串口的初始化及收发等,具体请参考:Qt 串口多线程—节一Qt串口收发



一、前言

Qt的多线程实现方式有多种,一是用QThread对象,将需要的操作放到线程里的;二是类直接继承QThread类,重写run方法;三是用QtConcurrent等。本实例中将介绍第一种。下一篇会介绍继承QThread类的用法。


提示:以下是本篇文章正文内容,下面案例可供参考

二、使用步骤

2.1 界面设计

界面设计参考节一,Qt 串口多线程—节一Qt串口收发

2.2 串口服务类创建

将串口数据收发放在新建的类中,创建ComService类继承自QObject来处理串口相关的操作。

其包含的类容如下comservice.h所示:

#ifndef COMSERVICE_H
#define COMSERVICE_H

#include <QObject>
#include <QSerialPort>


class ComService : public QObject
{
   
    Q_OBJECT
public:
    explicit ComService(QObject *parent = nullptr);
    QStringList GetSerialAvailable();
    bool InitSerial(QString portname);
    void CloseSerial();

signals:
    void UpdateSerialData(QByteArray data);

public slots:
    void ReceviceSerialData();
    void SendSerialData(QByteArray data);

private:
    QSerialPort *mSerial;

};

#endif // COMSERVICE_H

与节一相比,串口收到的数据通过信号发送给GUI,GUI的数据通过槽函数传给ComService对象,然后发送。具体的收发的实现与节一相同。

2.3 QThread实现

2.3.1 QThread的声明

首先在mainwindow.h中添加#include ,然后声明QThread mThread与ComService *mComservice对象;

2.3.2 串口多线程加载

1 实例mComservice对象

 mComservice = new ComService;
 // 此处与上一节不同,将获取可用串口信息直接放在串口类中
 QStringList mslist = mComservice->GetSerialAvailable();
 ui->comboBox->addItems(mslist);

2 子线程运行实现

mComservice->moveToThread(&mThread);
mThread.start();
// 退出时删除对象
connect(&mThread, &QThread::finished, mComservice,&QObject::deleteLater);

QThread需要手动管理线程,因此在现场终止时需在析构函数中删除线程

    mThread.quit();
    mThread.wait();

3 过程监控
在主线程与子线程数据更新中添加qDebug语句,即串口线程收到数据时,将数据发送给GUI线程后,打印子线程ID。GUI线程收到数据,将数据更新后打印GUI线程ID,观察运行是否正确。

三、完整代码

3.1 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值