封装一个基于进行串口通信的工具类如下:
- 头文件如下:
#pragma once
#include <QSerialPort>
#include <QDebug>
#include <QThread>
class SerialPortCommunication : public QSerialPort
{
Q_OBJECT
public:
SerialPortCommunication();
//串口参数结构体
typedef struct SerialPortSettings {
QString name; // 串口名
BaudRate baudRate; //波特率
DataBits dataBits; //数据位
Parity parity; //奇偶校验
StopBits stopBits; //停止位
FlowControl flowControl;//流控制
}Settings;
public slots:
//开启一个串口
void Start(const Settings& sets);
//停止一个串口
void Stop();
//向串口写数据
void Send(QByteArray data);
signals:
// 通知串口已开启
void sigStarted();
// 通知串口已停止
void sigStoped(int status);
// 通知串口已收到数据
void sigReceived(QByteArray data);
};
- 实现如下:
#include "SerialPortCommunication.h"
SerialPortCommunication::SerialPortCommunication()
{
connect(this, &QSerialPort::readyRead, [this]
{
//收到串口数据
QByteArray arr= readAll();
emit sigReceived(arr);
/*
//耗时工作
int sum=0;
for (int i=0;i<10000000;++i)
{
sum+=i;
}
qDebug()<<sum;
*/
});
}
void SerialPortCommunication::Start(const Settings& sets)
{
//设置串口参数
QSerialPort::setPortName(sets.name);
QSerialPort::setParity(sets.parity);
QSerialPort::setBaudRate(sets.baudRate);
QSerialPort::setDataBits(sets.dataBits);
QSerialPort::setStopBits(sets.stopBits);
QSerialPort::setFlowControl(sets.flowControl);
//打开串口
if(QSerialPort::open(QIODevice::ReadWrite))
{
emit sigStarted();
}
else{
//打开串口失败
emit sigStoped(1);
}
}
void SerialPortCommunication::Stop()
{
//关闭串口
if(QSerialPort::isOpen())
{
QSerialPort::close();
}
//正常停止传0
emit sigStoped(0);
}
void SerialPortCommunication::Send(QByteArray data)
{
if(QSerialPort::isOpen())
{ //写数据
QSerialPort::write(data);
}
}