QT:电池的TCP串口通讯

您所在的位置:网站首页 如何解析tcp报文数据的方法 QT:电池的TCP串口通讯

QT:电池的TCP串口通讯

2023-06-30 17:43| 来源: 网络整理| 查看: 265

目录

硬件

目标

前提知识

实践内容

一、设计简单的UI界面

二、串口通讯(发送和获取报文)

获取空闲串口

发送报文数据

接收报文

报文转换

三、解析具体电池信息

四、执行结果

硬件

        锂离子电池组

目标

        实现和电池组之间的通讯,获取电池的相关信息

前提知识

        报文接收要注意大小端,这里电池已默认是大端发送。

        和电池组实现通讯,首先要了解报文的组成,知道如何分解报文,获取报文的数据长度和具体数据内容。以锂离子电池组为例,该电池组的帧结构如下:

 所需的数据在INFO中,但INFO长度由LENGTH中的LENID决定。

而LENGTH中的后8位代表LENID。

实践内容 一、设计简单的UI界面

二、串口通讯(发送和获取报文)

使用该模块需要在pro文件中添加:QT += serialport 

主要使用两个类:QSerialPort和QSerialPortInfo

 包含两个头文件:

#include #include

在Widget类中完成 打开串口-发送报文-获取报文 的任务。

Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); m_serialport=new QSerialPort();//新建串口 serialport_init();//获取空闲串口 connect(m_serialport,SIGNAL(readyRead()),this,SLOT(receiver_data()));//如果串口有信息发送出来就执行receiver_data()进行数据接收 connect(ui->start,SIGNAL(clicked()),this,SLOT(send_data()));//如果UI界面上的“start”按钮被点击就执行send_data()进行报文发送 connect(ui->open,SIGNAL(clicked()),this,SLOT(open_serialport()));//如果UI界面上“open”按钮被点击就执行open_serialport()打开通讯串口 } 获取空闲串口

使用QList存储空闲的串口。

QListserialPortInfoList=QSerialPortInfo::availablePorts(); if(serialPortInfoList.isEmpty()){ return false; }

获取空闲串口后,遍历所有串口,获取串口的名字,显示在UI界面上。

QList::iterator iter=serialPortInfoList.begin(); while(iter!=serialPortInfoList.end()){ ui->port->addItem(iter->portName()); iter++; } 发送报文数据

将获取的数据转为Utf8存储在QByteArray中进行数据发送。

QByteArray send_message = ui->request->text().toUtf8();//从UI界面上获取要发送的内容 if (m_serialport && m_serialport->isOpen() && m_serialport->isWritable()) { m_serialport->write(send_message);//发送数据 ui->textEdit->append(send_message);//在UI界面上保持显示 } 接收报文

QByteArray发送数据,就QByteArray接收数据。由于该电池的报文发送回被分成好几次,所以要将收到的报文进行拼接。再通过SOI和EOI进行判断报文是否完整接收。

QByteArray rev_message; QString context; rev_message=m_serialport->readAll();//获取串口该次发送的全部数据 if(!rev_message.isNull()){//判断接收到的数据是不是空的 context= rev_message.toHex();//将byte转成十六进制显示 context=context.toUpper();//用大写方式显示十六进制 QString timeStrline="["+QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")+"][接收]:"; context=timeStrline+context+"\n\t"; QString content = ""+context+"";//设置字为蓝色显示 ui->textEdit->append(content);//显示数据 } Data_rev_all.append(Data_mid);//拼接数据,最终接收到的完整报文存在Data_rev_all中,在.h中定义QString Data_rev_all; int eoi=Data_rev_all.size()-1;//QString从0开始 //判断报头和报尾 if(Data_rev_all.at(0)=='7' && Data_rev_all.at(1)=='E' &&Data_rev_all.at(eoi-1)=='0'&& Data_rev_all.at(eoi)=='D'){ qDebug()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3