QT5串口上位机——从零开始教你写05(完)
简单串口编写
5.配置UI界面的串口收发功能
打开Serial.h文件,添加串口接收数据函数和串口发送数据函数,为了解决串口分段接收数据问题(此现象会导致部分中文接收时会产生乱码),要在此处添加定时器,让串口延时100ms接收数据(经过测试,这个值可以有效地减少乱码现象的产生)。
Serial.h 文件如下
#ifndef SERIAL_H
#define SERIAL_H
#include <QObject>
#include <QSerialPort> //添加串口类的头文件
#include "SerialInfo.h"
class Serial : public QObject
{
Q_OBJECT
public:
explicit Serial(QObject *parent = nullptr);
~Serial(void); //添加析构函数
void SerialOpen(); //添加打开串口函数
void SerialClose(); //添加关闭串口函数
void RecvSerialConfig(Sinfo *data);//接收串口配置参数函数
void SendData(QByteArray data, bool hexflag); //发送数据
void RecvData(); //接收数据
private:
QSerialPort* MySerial; //添加串口类成员
Sinfo *info=nullptr; //串口配置
QTimer *timer; //用于定时接收串口数据
QString InfoSet; //存储串口配置
QByteArray buffer; //串口数据临时缓冲区
signals:
void SetInfo(QString info);
void isnoSerialOpen();
void isRecvData(QByteArray); //发送接收数据
};
#endif // SERIAL_H
在Serial.cpp文件中创建timer对象,初始化buffer。
这里注意写法以及前面的 ,。
添加串口发送数据函数
首先,判断需要发送的数据是否为空,为空则返回。然后判断发送的数据类型,HEX格式则直接发送数据,否则需要判断编码格式后再发送,这里通过 info->Encode判断主页面选择的编码格式。
void Serial::SendData(QByteArray data, bool flag)
{
if(data.isEmpty())
{
return;
}
if(flag==true)
{
//hex模式直接发送
MySerial->write(data);
}
else{
//判断编码格式在发送
data=SetCodeType(data,info->Encode); //先根据编码转换数据编码格式
MySerial->write(data);
}
}
添加串口接收数据函数
首先添加串口读数据的信号,绑定相应的槽函数。在这里启动了定时器,当定时器定时结束时,即**timeout()**函数执行后,进行数据接收函数处理。
Serial::Serial(QObject *parent)
: QObject(parent)
,timer(new QTimer(this)) //创建timer对象,动态分配空间,指定父对象
,buffer(0) //初始化buffer
{
//动态分配空间,指定父对象
MySerial = new QSerialPort(this);
QObject::connect(MySerial,&QSerialPort::readyRead,this,[=]{
timer->start(100);//设置100毫秒的延时
buffer.append(MySerial->readAll());//将读到的数据放入缓冲区
});
connect(timer,&QTimer::timeout,this,&Serial::RecvData);//执行真正的读取操作
}
在接收数据时,先关闭定时器,然后从buffer中读取到相应的数据,之后通过**isRecvData()**函数将读取到的数据发送出去。
void Serial::RecvData()
{
timer->stop();//关闭定时器
QByteArray info = buffer;//读取缓冲区数
buffer.clear();//清除缓冲区
if(info.isEmpty())
{
//没有读取到串口数据就退出循环
return ;
}
emit isRecvData(info);
qDebug() <<"info"<<info;
}
其中,Serial.cpp文件内容如下
#include "serial.h"
#include <QDebug>
#include "codetype.h"
Serial::Serial(QObject *parent)
: QObject(parent)
,timer(new QTimer(this)) //创建timer对象,动态分配空间,指定父对象
,buffer(0) //初始化buffer
{
//动态分配空间,指定父对象
MySerial = new QSerialPort(this);
QObject::connect(MySerial,&QSerialPort::readyRead,this,[=]{
timer->start(100);//设置100毫秒的延时
buffer.append(MySerial->readAll());//将读到的数据放入缓冲区
});
connect