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

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显示控制
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值