QT5串口上位机——从零开始教你写05(完)

本文详细介绍了如何使用QT5构建一个串口上位机,包括从零开始编写串口收发功能,配置UI界面的串口发送和接收数据函数,以及如何解决中文乱码问题。通过设置定时器来延时接收数据,减少乱码的产生。同时,展示了如何在主页面中配置发送和接收函数,确保数据正确发送和显示。
摘要由CSDN通过智能技术生成

上一篇:QT5串口上位机——从零开始教你写04

简单串口编写

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值