串口多线程
不多说,直接上代码,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:串口
- 线程2:数据解析
- 线程3:数据存储
- 线程4:主线程,GUI显示控制