北斗定位串口/网口上位机设计【Qt/C++】

一、实验概述

1.1 实验背景

        在北斗定位系统的实际应用中,上位机作为数据处理与交互的核心载体,需实现多接口数据的实时收发、解析、显示及转发,是连接北斗终端与用户的关键环节。串口通信作为传统的设备间数据交互方式,因其硬件实现简单、兼容性强,被广泛应用于北斗定位模块与上位机的近距离数据传输;而网口通信(TCP/UDP)则凭借传输距离远、可扩展性强的优势,成为多设备协同、远程监控场景下的核心通信方式。两种接口的融合应用,是构建完整北斗定位数据处理系统的基础。 本实验基于Qt/C++框架开发上位机程序,针对北斗定位数据的串口与网口交互场景,实现数据的双向收发、解析(ASCII码与二进制格式)、多形式显示(文字/图形)、存储及转发功能。通过该实验,可深入理解跨接口数据处理的逻辑与实现方法,掌握北斗定位数据的标准化处理流程,为实际工程中北斗系统的应用开发奠定技术基础。

目录

一、实验概述

1.1 实验背景

1.2 实验目的

1.2.1 实现串口收发功能

1.2.2 实现网口收发功能

1.2.3 实现参数配置功能

二、(接收数据格式,省略.......)

三、总体设计

3.1 模块功能设计

3.2 数据传输流程

四、详细实现

4.1 串口通信模块实现

4.2 网口通信模块实现

4.2.1 TCP客户端模式

4.2.2 TCP 服务端模式

4.3 数据解析模块实现

4.4 数据发送模块实现

4.4.1 串口发送数据

4.4.2 网口发送数据

4.5 数据储存模块实现

4.6 UI显示模块实现

五、系统测试

5.1串口单独测试

5.1.1 串口连接

 5.1.2 接收$AE格式数据并显示

 5.1.3 接收$GNRMC格式数据并显示

 5.1.4 发送ASCLL码格式数据

 5.1.5 数据文本存储

 5.1.6 坐标点显示

5.2 网口单独测试

5.2.1网口连接

 5.2.2 接收$AE格式数据并显示

 5.2.3 接收$GNRMC格式数据并显示

 5.2.4 发送二进制格式数据

 5.2.5 数据文本存储

5.3 两者联调测试


1.2 实验目的

        掌握 Qt 框架下串口通信与网络通信的编程方法、实现 ASCII 码与二进制数据格式的解析与转换、掌握数据可视化显示(文字 / 图形)与持久化存储技术、理解配置参数动态管理、界面配置的实现逻辑、构建完整的 "接收-解析-处理-存储-转发" 数据链路、最终实现使用QT编写上位机代码

1.2.1 实现串口收发功能

1)从串口接收数据,数据格式如下:

格式:$AE,aaa.aaaaa,bb.bbbbb\r\n

解释:aaa.aaaaa表示经度,bb.bbbbb表示纬度

示例:$AE,112.12345,28.54321\r\n

经典格式:$GNRMC

$GNRMC,083559.00,A,3959.7890,N,11623.4560,E,15.0,300.0,051023,0.0,E,A*33

  • 时间:UTC 08 时 35 分 59.00 秒

  • 状态:有效定位(A)

  • 纬度:39°59.7890′ N(北半球)

  • 经度:116°23.4560′ E(东经)

  • 速度:15.0 节(约 27.78 公里 / 小时)

  • 航向:300.0°(西北方向)

  • 日期:10 月 5 日,2023 年

  • 磁偏角:0.0° E(东偏)

  • 模式:自主定位(A)

  • 校验和:*33

2)解析获取数据中的经度/纬度值,并完成如下功能:

将经度/纬度值在上位机UI界面上以文字形式打印显示。

将经度/纬度值在上位机UI界面上以图形方式打印显示。

将经度/纬度值以文本形式存储。

将经度/纬度值以二进制形式组包,通过网络方式(TCP/UDP))向外发送。发送格式如下:识别字:short型,两个字节,值为0xAABB;经度、纬度为Double型,8个字节,单位为度

1.2.2 实现网口收发功能

从网口接收数据(数据格式与功能1的网络数据格式相同)。

完成经纬度数据解析、打印显示及存储功能(同功能1)。

以ASCII码形式将数据从串口对外发送(数据格式与功能1的串口数据格式相同)。

1.2.3 实现参数配置功能

                   程序的串口参数、网口参数可通过界面配置,配置文件配置。

1.3 开发环境

操作系统:Windows 11

开发工具:Qt 6.9.1

编译器:MinGW(64 位版本 ,适配 Qt 6.9.1 )

辅助工具:虚拟序列端口模拟器(VSPE)、网络调试助手(NetAssist)。

图 1 开发环境

        通过软件模拟实现串口通信环境的灵活构建,为串口相关的开发与测试提供稳定的虚拟环境。因为硬件设备尚未到位,借助 VSPE 模拟传感器等设备的串口信号,提前开展软件逻辑测试;通过 NetAssist 建立 TCP 连接。

二、(接收数据格式,省略.......)

三、总体设计

3.1 模块功能设计

表 1  各模块核心功能

模块

核心功能

串口通信模块

接收定位数据 / 发送 ASCII 数据,参数动态配置

网口通信模块

TCP/UDP 接收定位数据 / 发送二进制数据

数据解析模块

解析GPS定位帧数据,提取经纬度数据

数据存储模块

以 TXT 格式保存经纬度数据(含时间戳)

参数配置模块

串口参数配置(波特率等)、网口(IP / 端口)参数配置

UI显示模块

文字显示经纬度,图形绘制定位点

3.2 数据传输流程

串口接收流程:串口数据 → 解析GPS帧数据 → 提取经纬度等有效数据 → 文字显示/图形绘制 → 文本存储 → 二进制组包 → TCP发送。

网口接收流程:网口数据(TCP) → 解析GPS帧数据 → 提取经纬度等有效数据 → 文字显示/图形绘制 → 文本存储 → 组包 ASCII 帧 → 串口发送。

四、详细实现

4.1 串口通信模块实现

        Qt北斗上位机的串口通信功能,核心流程包括串口搜索、参数配置、串口开关控制、三个环节,具体过程如下:

        串口搜索:程序通过QSerialPortInfo::availablePorts()获取所有可用串口信息,将端口名添加到下拉框(comComboBox),并在界面显示串口的名称、描述、制造商等信息,同时默认设置波特率为 9600。

图 3 串口搜索

        QSerialPort)对象,设置目标端口名,以读写模式(QIODevice::ReadWrite)打开串口,随后配置波特率(setBaudRate)、数据位(setDataBits)、校验位(setParity)、停止位(setStopBits)等参数;打开成功后,禁用参数配置控件,启动定时器(readTimer),可能用于定时读取串口数据。串口打开与配置:用户选择串口及参数(波特率、数据位等)后点击 “打开串口”,程序创建

图 4  打开串口

        串口关闭:用户点击 “关闭串口” 后,程序清除串口缓存、关闭串口(close)、释放QSerialPort资源(deleteLater),启用参数配置控件,停止定时器,完成资源回收。

图 5 关闭串口

表 2 串口通信关键代码

功能环节

关键代码

核心函数 / 类调用

串口搜索

QSerialPortInfo::availablePorts()

QSerialPortInfo(获取串口信息)、comComboBox->addItems(添加端口名)

串口初始化

serialPortset = new QSerialPort;
serialPortset->setPortName(...)

QSerialPort(串口操作核心类)、setPortName(设置目标串口)

串口打开

serialPortset->open(QIODevice::ReadWrite)

open(以读写模式打开串口,返回 bool 表示是否成功)

参数配置

setBaudRate(...)
setDataBits(...)
setParity(...)

setBaudRate(设置波特率)、setDataBits(数据位)、

setParity(校验位)

数据发送

serialPortset->write(QBtext)

write(串口发送数据,参数为 QByteArray)

串口关闭

serialPortset->close();
serialPortset->deleteLater();

close(关闭串口)、deleteLater(延迟释放对象资源)

状态控制

readTimer->start()/stop()

QTimer(定时器,控制数据读取周期)

4.2 网口通信模块实现

表格列出了TCP 通信(含客户端与服务端)的核心操作函数。

表 3 网口通信核心函数

函数名

作用

on_connectButton_clicked()

客户端发起连接,清理旧连接并创建新 QTcpSocket

on_disconnectpushButton_clicked()

强制断开连接并释放资源

on_stertlispushButton_clicked()

服务端启动监听,绑定 newConnection 信号

newConnection()

处理新客户端连接,绑定信号槽

readTcpData()

读取接收到的数据(需实现具体解析逻辑)

表格列出了 Qt 网络编程中 TCP 通信的核心信号与对应槽函数及其触发条件。

表 4 关键信号与槽

信号

槽函数

触发条件

QTcpSocket::connected

clientConnected()

客户端连接成功时

QTcpSocket::disconnected

clientDisconnected()

连接断开时

QTcpSocket::readyRead

readTcpData()

有数据可读时

QTcpServer::newConnection

newConnection()

服务端收到新连接请求时

4.2.1 TCP客户端模式

1、连接准备

        用户输入目标IP(可自动识别本地IP)和端口(默认1883),点击"连接"按钮触发 on_connectButton_clicked(),清理旧连接(若存在),创建新的QTcpSocket对象。

2、建立连接

        调用 connectToHost()发起连接,成功时触发clientConnected(),更新UI状态,失败时触发clientError(),显示错误信息。

3、数据通信

        通过 readyRead信号触发readTcpData()接收数据通过write()发送数据(需转换二进制格式)。

4、断开连接

     点击"断开"按钮调用on_disconnectpushButton_clicked(),强制关闭连接(abort()或disconnectFromHost())。

4.2.2 TCP 服务端模式

1、启动监听

   点击"开始监听"触发on_stertlispushButton_clicked(),创建 QTcpServer 并绑定 newConnection 信号,调用 listen() 在指定端口监听。

2、接受连接

        客户端连接时触发newConnection(),通过nextPendingConnection()获取客户端套接字,绑定客户端的readyRead和disconnected信号。

3、数据通信

        同客户端模式,通过信号槽机制读写数据。

4、停止监听

        点击"停止监听"调用 on_stoppushButton_clicked(),关闭服务器并断开所有客户端。

图 6 网络连接函数集

4.3 数据解析模块实现

          该工程支持两种格式($GNRMC和$AE)数据的解析,核心流程为数据读取→格式判断→有效数据提取→信息解析→UI 与坐标更新。

1、$GNRMC 格式解析:

        若数据中包含$GNRMC(标准 GPS 定位信息帧标识),先截取从$GNRMC开始到*(校验位前的分隔符)之间的有效数据(GPS_RMC)。

        将有效数据按逗号分割(split(','))为字段列表(GPS_list),提取经纬度相关字段(如GPS_list[3]、GPS_list[5]),转换为坐标点(QPointF)并添加到coordinates列表,最后调用update()刷新绘图。

图 7 $GNRMC 格式解析

2、$AE 格式解析:

        若数据中包含$AE且以\r\n结尾(自定义 GPS 格式),截取$AE到帧尾之间的有效内容,按逗号分割为字段列表(fields)。

        当字段数量为 3 时,提取经度(fields[1])和纬度(fields[2]),更新 UI 中的经纬度输入框(latitudeLineEdit、longitudeLineEdit),将坐标点添加到coordinates列表,调用update()刷新绘图。

图 8 $AE 格式解析

4.4 数据发送模块实现

4.4.1 串口发送数据

图 9 串口发送数据

4.4.2 网口发送数据

图 10 网口发送数据

4.5 数据储存模块实现

函数实现了GPS 解析数据的文本存储功能,核心作用是将串口接收的坐标及相关信息(如时间、通信标识)以追加方式写入指定文本文件(Location_Date.txt),便于数据持久化保存与后续查看。

图 11 数据储存模块实现

4.6 UI显示模块实现

        在图形界面上显示经纬度点,数据解析完成之后添加经纬度点,带有网格和坐标轴的坐标系,方便查看点的位置关系

图 12 坐标显示

        从界面文本框(ui->BDPlainTextEdit 等相关界面组件)获取数据,解析处理经纬度(lat_str、lon_str )、时间(time_str )、速度(velocity_str )、日期(date_str )等 GPS 相关信息,并将解析结果设置到对应的界面输入框(latitudeLineEdit、longitudeLineEdit 等 )显示,

图 13 UI显示模块实现

五、系统测试

5.1串口单独测试

5.1.1 串口连接

 5.1.2 接收$AE格式数据并显示

 5.1.3 接收$GNRMC格式数据并显示

 5.1.4 发送ASCLL码格式数据

 5.1.5 数据文本存储

 5.1.6 坐标点显示

5.2 网口单独测试

5.2.1网口连接

 5.2.2 接收$AE格式数据并显示

 5.2.3 接收$GNRMC格式数据并显示

 5.2.4 发送二进制格式数据

 5.2.5 数据文本存储

5.3 两者联调测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值