一、实验概述
1.1 实验背景
在北斗定位系统的实际应用中,上位机作为数据处理与交互的核心载体,需实现多接口数据的实时收发、解析、显示及转发,是连接北斗终端与用户的关键环节。串口通信作为传统的设备间数据交互方式,因其硬件实现简单、兼容性强,被广泛应用于北斗定位模块与上位机的近距离数据传输;而网口通信(TCP/UDP)则凭借传输距离远、可扩展性强的优势,成为多设备协同、远程监控场景下的核心通信方式。两种接口的融合应用,是构建完整北斗定位数据处理系统的基础。 本实验基于Qt/C++框架开发上位机程序,针对北斗定位数据的串口与网口交互场景,实现数据的双向收发、解析(ASCII码与二进制格式)、多形式显示(文字/图形)、存储及转发功能。通过该实验,可深入理解跨接口数据处理的逻辑与实现方法,掌握北斗定位数据的标准化处理流程,为实际工程中北斗系统的应用开发奠定技术基础。
目录
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; | QSerialPort(串口操作核心类)、setPortName(设置目标串口) |
串口打开 | serialPortset->open(QIODevice::ReadWrite) | open(以读写模式打开串口,返回 bool 表示是否成功) |
参数配置 | setBaudRate(...) | setBaudRate(设置波特率)、setDataBits(数据位)、 setParity(校验位) |
数据发送 | serialPortset->write(QBtext) | write(串口发送数据,参数为 QByteArray) |
串口关闭 | serialPortset->close(); | 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显示模块实现