QT 高效串口读取、显示与存储软件开发之三:串口高效读取(线程讨论)hdntCom库(2)

Qt 串口多线程 本文是Qt串口QSerialPort使用的入门篇,从获取串口到初始化、开关收发等做了简单的介绍。关于参数初始化方面,若有兴趣,如常用的串口调试助手一样可以自己将参数设置部分添加到界面中,然后通过获取界面上的参数来初始化参数。下一篇中,将介绍QSerialPort串口与QThread线程结合使用的内容。......... 阅读详情

QT 高效串口读取、显示与存储软件开发之二:串口高效读取(线程讨论)

串口多线程

不多说,直接上代码,hdntCom.h头文件

#ifndef HDNTCOM_H
#define HDNTCOM_H

#include "hdntcom_global.h"
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QtSerialPort/qserialport.h>
#include <QThread>
#include <functional>

class SerialSetInfo{
public:
    QString ComName;
    QString BaudRate;
    QString DataBit;
    QString StopBit;
    QString Parity;
    QString Protocol;
};

class HDNTCOMSHARED_EXPORT hdntCom:public QObject
{
    Q_OBJECT
public:
    hdntCom(QObject *parent);
    ~hdntCom();

    int Init(SerialSetInfo *SerialSetParm);  //Init the serial port
    int Open();  //open
    int Close();

    int Write(QByteArray *Dat);
    QByteArray Read();

    bool isOpen();
    QByteArray ComData;
    uint8_t *uComData;
    uint16_t ComDataLength;

    QSerialPort * m_serial = nullptr;
    QSerialPort * mth_serial = nullptr;

    bool mThreadRun=true;

    bool OpenFlag=false;


    void setCallback(std::function<void(void)> func);

    bool BufFlag=true;
    QByteArray Buffer1,Buffer2;
private slots:
    void ReceiveComData(void);

signals:
    void SendReceiveData(QByteArray Dat);
    void Sg_ComReady(void);

private:
    std::function<void(void)> m_func;
    uint8_t BufferNum=2;
    bool SolveFlag=true;


    QThread *Th_ComWork;

};

#endif // HDNTCOM_H

重点是将这个类继承自Object。然后利用movetothread进行多线程操作。如下:

connect(m_serial,SIGNAL(readyRead()),this,SLOT(ReceiveComData()));
this->moveToThread(Th_ComWork);
m_serial->moveToThread(Th_ComWork);

将自身和串口同时加入到线程中。

负载测试

连续开机4小时,串口波特率921600,数据更新率1kHz
在这里插入图片描述
串口读取缓存始终很稳定,未向之前的那样出现大量溢出。

终于搞定了

终于搞定了,目前线程分配:

  1. 线程1:串口
  2. 线程2:数据解析
  3. 线程3:数据存储
  4. 线程4:主线程,GUI显示控制
Qt中利用多线程读取串口数据 需求:有多个串口进行数据的处理,最好需要把线程封装到串口类(serialPort)中 这样就可以在主线程中通过new多个serialport对象myPort1、myPort2等来创建多个线程管理各个串口 实现方式:继承QObject的方式来写线程, 所有东西都需要用信号和槽来进行交互!!!思路:主线程中需要的操作:通过控制一个按钮来操作一个串口的关闭,即控... 阅读详情

相关推荐

Qt入门教程【硬件编程】QSerialPort串口对象

QSerialPort串口对象

小鱼酱的博客 2519

QT接收串口数据接收处理(校验数据完整性)缓存处理

C#代码基本如下: private List<byte> buffer = new List<byte>(4096);   void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (Closing) return;// 如果正在关闭,忽略操作,直接返回,尽快的完成串口监听...

于大博 1万+

图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂!

Dijstra算法

普罗米修斯的博客 18万+

Qt多线程双缓冲串口实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、效果展示二、使用示例三、封装类头文件介绍 前言 解决串口通信频率过快而导致的数据粘包情况,经测试,可实现1ms/1kb数据不沾包的情况。使用环境:Qt5.12.9 Mingw32位 release版本 一、效果展示 二、使用示例 三、封装类头文件介绍 ...

weixin_43429223的博客 1705

优化算法 | 赏金猎人优化算法(Bounty Hunter Optimizer, BHO)及其在多无人机移动边缘计算与路径规划中的应用(附matlab源代码)

移动边缘计算(Mobile Edge Computing, MEC)通过将计算资源下沉至网络边缘,有效解决了物联网终端设备计算能力不足与能耗受限的问题。无人机(Unmanned Aerial Vehicle, UAV)因其高机动性、灵活部署和广域覆盖等优势,被广泛用作MEC的移动服务器平台。多无人机辅助MEC系统的核心优化问题在于:如何在满足任务处理时延约束和无人机能量限制的前提下,联合优化无人机的三维飞行轨迹、任务卸载决策与计算资源分配,以最小化系统总能耗或最大化任务完成效率。

尘世冰封的专栏 224

2026 Claude Code 标准化前端UI SKILL——Frontend Design

是 Anthropic 官方开源的技能包,在 Claude 官方插件站中排名第一,超过 52k 的下载量。场景推荐方案快速体验批量安装官方 Skills深度设计策略叠加完整打磨流程集成终端跑claude一句话总结:Frontend Design 不是给 AI 加新能力,而是给 AI 加审美标准。它让 AI 从“能画”变成“会设计”——先想清楚风格,再动手写代码。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 3617

QT 高效串口读取、显示与存储软件开发之二:串口高效读取(线程讨论)hdntCom库(1)

QT 高效串口读取、显示与存储软件开发之二:串口高效读取(线程讨论)串口数据操作connect直接连接线程中直接读取利用movetothread在线程中开启串口 串口数据操作 搜了大量的资料,也看了QT的文档,串口读取有以下几种方案,包括:connect直接连接、线程中直接读取(Run)、利用movetothread、在线程中开启串口(打开串口)。所有的串口操作均封装在动态连接库中,名为:hdnt...

liuning1898的专栏 1571

MSBlock赋能C2f模块,让目标检测在轻量化与精度间双向突破

在文件夹下新建,将上述MSBlock和C2f_MS类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义模块。

LXY_LOVE36的博客 144

QT 串口发送接收(带发送缓冲区)

QT,串口发送接收,发送缓冲区

每晚秃头的程序员的博客 3360

第二天 原来Labview语言结构也挺自然(2.1 顺序结构)

新建项目文件StructureTest.lvproj,新建四个子VI(FlatSequence.vi、CaseStructure.vi、LoopStructure.vi、EventStructure.vi),具体新建流程可以参考1.2节。

weixin_38637405的博客 1004

YOLOv11损失函数进阶:融合SmoothL1与FocalLoss,让检测精度再涨10%的实战教程

在YOLOv11的这里的beta参数控制“L1与L2的过渡阈值”,默认设为1.0即可兼容多数场景。同样在# 计算动态alpha(基于类别样本数,需提前统计self.class_counts)# 交叉熵基础# FocalLoss权重else:使用前需统计数据集的(每个类别的样本数),并传入的alpha参数。损失函数是YOLOv11精度的“灵魂”——SmoothL1让边界框回归“稳、准、狠”,改进FocalLoss让类别分类“雨露均沾”。从代码改造到实战落地,本教程已为你搭建了一条精度跃升的路径。

m0_64661770的博客 213

QT串口单独线程高速接收

利用QT线程读取串口,能够读取高频的数据,测试200Hz的数据没有问题。 线程读取时需要添加时间循环,避免读取太快读不出内容。

u012123768的博客 7309

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1182

qt 串口 环形缓存_Qt QSerialPort缓冲

I am reading information from a serial port. How do I wait for a newline to come in, and then deal with the data? That is, how do I make sure I'm chunking a whole line at a time.This code does not wor...

weixin_39561673的博客 1182

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

利用QtRO解决QSerialPort跨线程调用问题

Qt Remote Object简称QtRO,这是Qt5.9以后官方推出来的新模块,专门用于进程间通信(IPC)。在这之前,要实现进程间通信有多种方式,这里就不做介绍了,而Qt官方推出的这个新模块是基于Socket来封装的,使用起来非常方便,兼容LPC和RPC。LPC即Local Process Communication,而RPC是指Remote Process Communication,两者都属于IPC。QtRO能够工作于这两种不同的模式:如果用于LPC,则QtRO使用QLocalSocket;

Jason的技术探索与分享 2387

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Qt之串口编程

1.使用qt自带的QSerialPort类实现,此类在Qt5.0之后实现的,这种实现方式不用考虑第三方类库可能带来的问题,使用起来比较简单。先设计简单的串口操作界面: 代码实现: 头文件包含#include <QtSerialPort/QtSerialPort>串口变量定义QSerialPort* serialPort;在打开串口按钮的关联的点击槽函数中if(isOpen){ s

迷惘宅猪的专栏 2462

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

hdntCenter软件更新纪要

hdntCenter-V2.0 号外 号外 1、二月初会有重大更新,敬请期待!!! 2、如有更新要求及建议,欢迎邮件沟通。 3、如果有更新建议请发送邮件:liuning1898@qq.com 定有重谢 待调试bug 1、偶尔会出现噪点,初步分析为底层协议架构不合理造成。21年2月份重点解决该内容。 2、多窗口打开不会自动弹出,还需手动查找。 3、不支持中文路径。 2021010601 1、引入V1_0版本HdntCenter软件,可用于数据不丢数记录,编程语言C#。 后续还会加入VS C++版本软件,用于综

liuning1898的专栏 551

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

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

qq_39262215的博客 1万+

Qt|多线程串口通信

qt实现多线程串口通信

编程改变世界。想做一些改变世界的产品。感谢一键三连。 2815

Qt 实现多线程的串口通信

简述 QT下无论是RS232/482/422的串口通讯均可以使用统一的编码实现。本文是将每路串口的通讯各放在一个线程中,使用movetoThread的方式实现。 代码实现思想: 用SerialPort类实现串口功能,然后Widget类来调用 SerialPort.h代码如下: #include <QObject> #include <QSerialPort> #include <QString> #include <QByteArray> #inc

qq_42964109的博客 3608

Qt 串口通信与QThread多线程实现

Qt 串口通信与QThread多线程实现

Yokexi的博客 2205

QT在PC开发中多串口通信有哪些方法

但是,如果槽函数是跨线程的,那么您需要确保信号和槽的参数是线程安全的,或者使用Qt的元对象系统(meta-object system)来进行线程间的通信。在Qt中,将QSerialPort对象作为某个类的子对象(即使用new QSerialPort()),并且随后尝试通过moveToThread()将其移动到另一个线程中,这通常是不推荐的,也是不安全的。,如果你确实需要将QSerialPort对象移动到另一个线程,请确保你完全理解Qt的线程模型,并且你能够正确地管理对象的生命周期和线程间的同步。

梦里蓝天 2536

Qt多线程串口通信

目标:实现Qt程序在与esp8266进行收发数据的同时通过另一个线程与开发板进行串口通信。主线程:发送AT指令连接服务器,将子线程发来的温湿度数据通过串口发送给ESP8266模块。接收来自服务器发来的指令,处理后又发给子线程。(这里要先把esp8266设置成AP模式)子线程:接收开发板的温度数据并发给主线程;接收主线程传来的命令并通过串口发送给开发板。实现子线程:定义一个串口对象,然后用moveToThread()将该对象放在子线程。...

Nathaniel123的博客 3167

Qt经验之实现一个多线程的串口接收类QSerialPort

在Qt的编程中,如果不是迫不得已的情况下,一般的我们不建议线程数多于3个。 同时,我也不建议把串口接收的类封装为一个多线程的操作,因为串口和网络这些收发数据都是异步的,操作系统会调度,完全没必要再去封装为一个多线程。把接收到的数据需要计算的,耗时处理的扔到另一个线程里,这才是我们应该考虑的事情。 但是,有时候,我们迫不得已在串口或者网口接收数据后立马做一些操作,所以也会采用多线程的串口类。 在此,再次建议大家,不要把串口、网口这些接收的类封装到多线程中。.....................

ifeng12358的博客 7224
上一篇: QT 高效串口读取、显示与存储软件开发之二:串口高效读取(线程讨论)hdntCom库(1)
下一篇: (Error -6311) PRSC module failed to write to a register. 问题的探讨
工匠老刘
博客等级 码龄18年 59粉丝 25原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值