QSerialport多线程方法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

    使用Qt也已经有一段时间了,虽然使用过继承QThread重写run函数,以及继承QObject然后使用MoveToThread两种方法实现多线程,但是在QSerialPort的使用过程中,两种方法都存在一定的问题。

典型的问题:QObject: Cannot create children for a parent that is in a different thread.

    原因:在主线程中创建了QSerialPort对象在子线程中调用,或者在子线程中创建然后在主线程中调用了。

对于继承QThread重写run函数的情况,往往容易在run外部定义QSerialport *port = new QSerialport()对象,然后在run中调用port->readAll()等函数,然而根据QThread的特性,只有run函数才运行在新的子线程中,所以这里就跨线程调用了 QSerialport对象,会出现上述报错

已有解决办法:

    要解决这样的问题,可以借鉴https://blog.csdn.net/u010842812/article/details/28898761这篇博文使用的方法:派生类外部定义QSerialPort指针,在run函数中再定义对象,并且数据的读、写都在run函数中进行。

    上述方法可以解决报错,但是针对不仅仅具有读串口数据需求、还需要向串口写数据的情况,显然这样的方法会让run函数变得十分臃肿,代码的维护十分麻烦。

推荐办法:

    运用继承QObject,结合MoveToThread()的方式:

    自定义my_serial类,继承自QObject,将一个QThread local_thread 对象作为派生类的成员,使用QObject的MoveToThread()将派生类自己以及QSerialPort对象都移动到local_thread线程中,这样派生类中的槽函数以及QSerialPort中的信号与槽函数都将在local_thread线程执行。头文件:

#include <QObject>
#include <QSerialPort>
#include <QThread>
#include <QString>
#include <QByteArray>
#inc

Qt - C++ - QThread线程QSerialPort类配合使用监听串口中的数据 Q_OBJECTpublic:protected:// 打开串口,使用合适的串口参数if (serial.waitForReadyRead(1000)) { // 等待数据可读,超时时间为1秒// 读取所有可用的数据// 处理数据,例如打印到控制台或发送到其他线程进行处理。 阅读详情

相关推荐

qserialport多线程读写应用:操作指南详解

深入剖析QSerialPort多线程环境下的安全读写机制,详解信号槽跨线程传递、串口资源保护与QThread最佳实践,避免常见崩溃与数据错乱问题。结合QSerialPort核心API与线程同步策略,助你稳定构建高性能串口通信应用。

weixin_42593130的博客 348

Qt学习:QSerialPort

QSerialPort 负责具体的串口操作。 最基本的操作无非是read() 和 write()。需要注意的是这两个操作都是非阻塞的。 另外有一个重要的signal 也需要用到,那就是 void QIODevice::readyRead() 每次串口收到数据后都会发出这个signal。我们的程序中需要定义一个slot,并将其与这个signal 相连接。这样,每次新数据到来后,我们就可以在slot中...

baidu_35260565的博客 3009

Blocking Receiver :QT串口阻塞接收

QString是可重入的,但不是线程安全的,不建议从一个启动、调用和超时或另一个的响应数据中读取串行端口名。使用Qt的阻塞串行编程API通常会导致代码更简单,但由于它的阻塞行为,它只能在非GUI线程中使用,以防止用户界面冻结。方法waitForBytesWritten()应该在阻塞方法的每次write()调用之后使用,因为它处理所有的I/O例程,而不是Qt事件循环。应该在每次调用阻塞方法的read()之前使用方法waitForReadyRead(),因为它处理所有的I/O例程,而不是Qt事件循环。

qq_42108961的博客 1556

【Qt开发】串口通信收不到QSerialPort::readyRead信号的问题

Qt利用QSerialPort模块与串口设备通信时,收不到readyRead SIGNAL,进而导致无法正常读取数据怎么办? 本文给出了答案,并附有代码示例。

csdnofhaner的博客 4871

QT开发之串口通信(二)

有时候发送的数据太多,QSerialPort::readyRead串口接收的就会不完整,使用串口监控软件可以看到数据其实都发了,但是发送的时间不一致,可能存在100毫秒以内的延时,这就导致使用QSerialPort::readyRead接收数据就不完整了 解决办法: 1、在发送的数据中增加帧头帧尾来判断接收的数据完成性,不完整就将下一条的合并一起一起判断 2、使用定时器将一段时间内的数据接收起来 以我https://blog.csdn.net/bigtree_mfc/article/detai.

金属服务,美好生活,天网改变世界,华帝量子科技。 2510

如何从QSerialPort::readyRead函数中解析包

信号会在串口缓冲区有新数据可读时发出。当你接收到这个信号后,需要从串口对象中读取并解析这些数据。通常,串口通信的数据包会有特定的起始和结束标志、长度字段或者其他协议约定,用于区分不同的数据包。在使用Qt的QSerialPort进行串口通信时,

土豆 1330

Qt实战---多线程的串口接收类QSerialPort

Qt | QSerialPort、QTcpSocket等QIODevice设备的跨线程调用报错解决办法以及多线程的使用

qq_39262215的博客 1万+

Qt串口QSerialPort多线程QSerialPort的waitForReadyRead函数的问题

在官方的文档中提到,QSerialPort是不支持跨线程调用。 因此不能在主线程(UI线程)创建QSerialPort,然后传递个指针给子线程,然后在子线程中执行耗时的发送任务。 最好的方式是在子线程里面创建QSerialPort,然后通过信号槽来使用。 但是我想偷个懒,我已经在主线程创建了QSerialPort,并且界面相关的东西都做好了,不想改动太大,因此我想了个办法: 在新线程里面建立一个临时对象,复制传递进去的串口参数,执行完就干掉他。 void MainWindow::on_pushButton_

joyopirate的博客 2万+

【Qt开发】QSerialPort串口配置、发送、接收回调函数 多线程接收的串口类封装

【Qt开发】QSerialPort串口配置、发送、接收回调函数 多线程接收的串口类封装

Mike Zhou的博客 2117

(Parent is QSerialPort(0x4ab1ab0), parent‘s thread is QThread(0xbe3860)......问题解决办法

原因:在主线程中创建了QSerialPort对象在子线程中调用,或者在子线程中创建然后在主线程中调用了。 1.对于继承QThread重写run函数的情况 往往容易在run外部定义QSerialport *port = new QSerialport()对象,然后在run中调用port->readAll()等函数,然而根据QThread的特性,只有run函数才运行在新的子线程中,所以这里就跨线程调用了 QSerialport对象,会出现上述报错。示例代码如下: class SerialThread :

玉心的博客 3079

QSerialPort关键信息总结

Qt串口编程关键要点总结 线程要求:串口的打开、发送、接收操作必须在同一线程(如主线程)完成。多线程操作需通过moveToThread或QMetaObject::invokeMethod实现。 发送机制:write()为异步发送,底层无限缓冲数据,需配合waitForBytesWritten()确保发送完成。 接收优化: 保持readBufferSize=0避免丢包,readyRead信号触发后调用readAll()读取数据。 通过SetupComm调整接收缓冲区(如32KB),减少高频信号触发。 数据解析

hao1183716597的专栏 563

QT5串口多线程--派生类加moveToThread

之前讲过继承QThread,在虚函数run()中实现线程里的工作。这是qt4.6之前的方法,目前官方推荐的方法,是继承QObject类,再用方法moveToThread来将QObject派生类移动到新线程中去,这样QObject派生类定义的信号和槽的事件响应行为,都会发生在新的线程中。这个方法非常简单。下面还是以串口通讯作为例子,这次不用窗口,用控制台的方式。

宁静致远的博客 1376

qserialport数据帧解析方法:一文说清处理流程

深入讲解qserialport在串口通信中如何高效解析数据帧,涵盖帧头识别、长度判断与校验处理等关键步骤,提升开发效率与稳定性。

weixin_33308579的博客 822

Qt串口开发实战:QSerialPortQSerialPortInfo的深度应用指南

本文深入探讨了Qt串口开发中QSerialPortQSerialPortInfo的实战应用,涵盖基础配置、数据收发模式、错误处理及多线程编程等核心内容。通过实例代码展示如何高效实现串口通信,特别适合工业控制、设备监控等场景开发。

weixin_30892037的博客 362

保姆级教程:在Qt6中用子线程处理多个QSerialPort,实现多设备同时通信

本文详细介绍了在Qt6中使用子线程处理多个QSerialPort实现多设备同时通信的工业级解决方案。通过线程隔离架构设计,确保GUI线程流畅运行,同时提供稳定的串口通信能力。文章包含完整的代码实现、性能优化技巧及实际应用案例,特别适合工业自动化和物联网开发人员参考。

weixin_28712661的博客 237

Qt串口编程实战:QSerialPortQSerialPortInfo的深度应用指南

本文深入探讨了Qt串口编程中QSerialPortQSerialPortInfo的实战应用,涵盖串口设备发现、参数配置、数据收发及高级功能实现。通过实例代码和优化技巧,帮助开发者高效解决串口通信中的常见问题,提升开发效率。

weixin_42520374的博客 210

嵌入式开发笔记:QSerialPort 完整使用指南——从基础 API 到工程实战

QSerialPort 串口开发指南摘要 本文全面介绍了 Qt 框架中 QSerialPort 模块的使用方法,涵盖从基础 API 到工程实战的关键知识。主要内容包括: 环境搭建 - 如何在项目中添加 serialport 模块并包含必要头文件 串口枚举 - 使用 QSerialPortInfo 获取系统可用串口设备信息 串口配置 - 正确设置端口名称、波特率等通信参数的方法 数据收发 - 同步/异步发送数据、接收处理 readyRead 信号等核心操作 错误处理 - 通过 errorOccurred 信号

qq_43091070的博客 305

QT 串口多线程

注意这里QSerialPort的open动作必须要放在重写的run函数内(open动作在子线程中),不能通过信号和槽进行触发(open动作在主线程中),使用信号和槽进行触发,尽管QSerialPort对象和readyread的槽函数都在子线程,但依旧会阻塞readyread信号。如果串口的数据接收与数据发送过程在主线程,那么在进行复杂操作时将会引起阻塞,QSerialPortreadyread信号无法触发,为了解决窗口移动、窗口大小调整时无法实施接收数据问题,将串口的一系列操作移到子线程进行。

qq_54659161的博客 70
上一篇: QT对OPenGL的封装
RaoJohn
博客等级 码龄11年 4粉丝 3原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值