APP下载

一种使用Qt的姿态传感器显控设计与实现

2019-07-26王潇卢如意李博

声学与电子工程 2019年2期
关键词:控件串口数据包

王潇 卢如意 李博

(第七一五研究所,杭州,310023)

姿态传感器显控软件是连接计算机终端与传感器的桥梁,其将控制指令发送给传感器并使计算机终端接收到测量数据,使整个测量系统构成回路。以传统的MFC(Microsoft Foundation Classes)方法开发复杂的图形界面,需要程序员编写大量的代码,对控件的实现需要调用底层的作图函数进行绘制,开发时间长。而Qt具有跨平台性能[1],可以一次编写多处编译,具有良好的封装机制、友好的信号-槽连接事件驱动机制,并提供Qt Designer图形界面开发工具[2],可进行拖拽式的界面控件排布,便于程序开发。本文介绍了一种使用 Qt的姿态传感器显控软件设计方法,以较小的代码量以及较短的开发周期实现了计算机终端与姿态传感器的控制指令及测量信息的交互,以及测量数据实时显示保存的功能需求。

1 姿态传感器概述

本文所使用的姿态传感器通过 RS485串口与外部设备通信,可同时上传偏航角、俯仰角、横滚角以及温度数据,将其封装在一个15 Byte数据包中。测量数据通信协议如表1所示。

表1 姿态传感器测量数据通信协议

若干个姿态传感器由下位单片机串联在RS485通信总线上,共用一个串口与显控终端通信,通过姿态传感器的通信地址寻址通信,即可同时测量一个阵列中各节点处的姿态数据,上传的测量数据即为若干个15 Byte数据包的拼接,非传感器通信地址的命令帧将不予响应。显控软件在打开串口建立串口通信后即发送开始测量指令,串联在一起的若干个传感器即可按照给定的频率上传测量结果数据。显控软件解析数据包,可得到连接的传感器数量并显示测量结果数据与图线。

2 软件架构

姿态传感器显控软件根据功能组成划分为串口通信模块、图形显示模块与数据存储模块,如图1所示。

图1 姿态传感器显控软件架构图

串口通信模块使控制指令及测量结果根据相关通信协议进行封包或解析[3],并以数据帧的形式进行上传与下发。该模块使用Qt封装的QSerialPort串口控件[4],其提供主要接口函数如表2所示。

表2 QSerialPort控件接口函数

图形显示模块将从串口获取的测量数据显示在界面中并绘制成图线。该模块使用 Qt提供的QGraphicsView 控件[5],其依靠 QGraphicsView-QGraphicsScene-QGraphicsItem的三级机制绘图:View为“画板”,Scene为“画布”,Item即为绘制在“画布”上的图形。图形显示区域采用 QMdiWidget的多子窗口显示机制,由测量数据包解析结果获取传感器数量并生成对应数量的子窗口,可采用平铺(tile)或层叠(cascade)的方式同时显示所有子窗口,或者以选项卡的形式最大化某一子窗口。这部分内容将在第3节介绍。

数据存储模块将测量数据实时存储到本地的CSV 文件中[6]。该模块封装了 Qt的 QFile类与QTextStream类,以实现数据文件的存储。

软件的UML类图如2所示。图形显示模块由PaintArea类构成,其为继承自QGraphicsView的子类,嵌入在MesFigDisArea类中,它的类对象作为后者成员变量,一起构成测量数据及图线的显示控件。DMCCom_Array类为主界面类,其包含了串口通信模块与数据存储模块,由一个QList装入若干MesFigDisArea类对象,可同时显示多个传感器的测量结果。

图2 姿态传感器显控软件UML类图

软件运行流程如图3所示。在以给定参数配置打开串口之后,与下位机建立通信并发送上数指令,在状态栏显示串口状态。在接收到下位机第一次上传的数据包之后进行解析。首先,如果数据包长度为单个传感器数据包长度整数倍,则判断为正确数据包,不符合条件的直接剔除。对于正确数据包,遍历数据包的每一个字节寻找0xAA、0x55的帧头,检测帧头后第4个字节的指令位是否为0x31的反馈标识判断是否为有效数据包,剔除不符合反馈标识的数据包;对于有效数据包,计算帧头后续第4~13个字节的检验和判断是否为正确数据包。对于每个帧段都满足以上条件的正确数据包,根据帧头数量得到下位机所串联的传感器数量,据此初始化出相应数量的子窗口,默认以平铺的方式显示在主界面的多窗口显示区域中,并更新传感器列表及状态栏中的传感器数量。此后,根据通信协议给定的字节顺序以及分辨率解析每个帧段的数据位,得到各项测量数据并在界面中显示、保存。对于下位机后续上传的数据包,同样根据以上方法判断数据包的正确性,剔除错误数据包,解析出正确数据包的测量值,并在界面中更新显示。软件会记录持续测量时间以及测量数据上传次数并在界面中显示。

图3 姿态传感器显控软件流程图

3 软件界面设计

软件主图形界面见图 4,左侧区域用作串口参数设置及操作、测量计数显示、传感器列表显示以及测量结果存储操作。其中,以一个 QListWidget控件显示由数据包解析到的传感器列表,并与右侧测量结果显示区域联动。主界面右侧以一个QMdiWidget控件显示测量结果。主界面下方状态栏可显示当前串口状态以及检测到的传感器数量。

偏航角、俯仰角、横滚角与温度测量值显示子窗口界面如图5所示。界面上方显示4个测量数值,右侧以4个QGraphicsView小控件显示曲线对应的颜色图例。下方的白色区域为显示曲线图的QGraphicsView控件。每个传感器均独立地以一个子窗口显示测量值及图线。

图4 姿态传感器显控软件主界面

图5 测量值显示子窗口

4 软件功能实现

建立串口通信后,显控软件向姿态传感器发送“开始测量“指令,使之以应答模式或者广播模式工作。显控软件收到传感器通过串口上传的测量数据包,按照通信协议进行解析,解算出偏航角、俯仰角、横滚角与温度,获取当前时间后在相应控件中显示并保存到本地文件。同时,显控软件将偏航角、俯仰角、横滚角与温度换算为 QGraphicsView的场景中的坐标值并绘制出曲线图。

4.1 指令发送与数据包解析

使用QSerialPort串口控件类,需要注意的是在调用 open()函数打开类对象的串口时须使用COMMTIMEOUTS结构体对象来设置串口类对象的超时。在设置完串口波特率、数据位等参数并设置好超时后即在计算机与传感器之间建立了串口通信。

控制指令同样以数据帧的形式发送,使用一个QByteArray类对象,以 append()函数依次压入 16进制的指令字节,然后将 QByteArray类对象作为串口类对象write()函数的实参调用即可发送控制指令给传感器。

串口接收到数据后,将会触发QSerialPort串口类对象的readyRead()信号函数。基于Qt的信号-槽事件驱动体制,将readyRead()信号与用于读取数据的自定义槽函数通过connect()函数连接即可使显控软件做出读取到串口数据后的响应动作。在自定义槽函数中,通过串口类对象的readAll()将从串口获取的字节数组赋给QByteArray类对象,使用一个8位无符号整型数据作为元素的 QList容器存入QByteArray类对象中的各个字节以便进行后续的解析工作[7]。

将反馈数据包存入 QList容器后,以容器的size()函数判断数据包的长度,其值应为单个传感器反馈的测量结果数据包长度的整数倍,即 15 Byte的整数倍,若不满足该条件则认为数据错误并剔除。反之,将QList容器作为实参传入数据包解析函数,查看每个15 Byte帧段的首两个字节是否为0xAA 0x55的双字节数据包帧头、每个帧段的第 5 Byte是否为 0x31的反馈标识、计算每个帧段第 4~13 Byte的检验和与第14 Byte是否吻合来检验数据包的正确性。同时满足以上三个条件方为正确的测量结果帧段。剔除错误数据包,对于正确结果将第6~13 Byte的偏航角、俯仰角、横滚角与温度数据以高字节在前、低字节在后的顺序换算为 10进制的整型数据,再乘以给定的分辨率得到相应的测量值。以一个QList容器依次装入4个测量值,再以一个 QList>容器装入各传感器的测量结果返回。在第一次得到测量数据包时,通过QList>容器的元素个数即可获取当前串联的传感器个数,据此初始化出相应数量的子窗口进行显示。

4.2 测量结果数据曲线绘制

在收到测量数据包并解析之后,从QList>容器中获取各传感器的偏航角、俯仰角、横滚角与温度测量结果显示在相应区域。同时,程序以2个像素为测量数值曲线的显示宽度,根据数值的测量时序给每个测量点赋予在曲线图中显示的横坐标值;再将测量值换算为在QGraphicsScene场景中的纵坐标值,即可将一组测量值转换为QGraphicsScene中的QGraphicsItem,调用QGraphicsScene的addItem()函数,即可将测量点Item绘制在场景中。以前后两组测量点为端点,可绘制一个线段Item于两个测量点之间。据此,即可实现测量结果图线的绘制。同时,重载QGraphicsView的resizeEvent()与wheelEvent()虚函数[8],可实现图线随着窗口大小自动调整显示比例以及缩放。

图6 测量结果显示

从下位机接收到正确数据包并解析数据后,以独立子窗口显示各传感器测量结果如图6所示。对于需要重点关注的传感器,可将该子窗口以选项卡的形式最大化显示。

4.3 测量结果数据保存

在显示并绘制测量值及图线的同时,数据存储模块将测量结果以CSV文件的格式保存在弹出对话框选定的路径中。存储模块以QFile类对象建立CSV文件,以QTextStream类对象将测量结果以文本流的形式输出到目标文件中。CSV文件本质上是以逗号分隔的TXT文本文件,在以文本流输出一个测量值后跟着输出一个逗号,即可实现以表格形式存储测量数据。在初次存储数据时,首先建立CSV文件,输出包含上数时间以及各测量项的表头,后续每次保存都按照给定顺序输出即可。软件可以手动保存或者设定时间间隔以定时器进行自动保存。测量结果文件见表3。

表3 测量结果CSV文件

5 结论

本文提出的基于 Qt的姿态传感器显控软件设计思路,灵活调用 Qt图形界面库中高度集成、成熟的串口通信控件与二维图形绘制控件,在一定程度上减轻了软件编制难度,以较小的代码量以及较短的开发周期实现了计算机终端与姿态传感器的控制指令及测量信息的交互以及测量数据实时显示、保存的功能需求。

猜你喜欢

控件串口数据包
二维隐蔽时间信道构建的研究*
浅谈AB PLC串口跟RFID传感器的通讯应用
民用飞机飞行模拟机数据包试飞任务优化结合方法研究
基于.net的用户定义验证控件的应用分析
C#串口高效可靠的接收方案设计
关于.net控件数组的探讨
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
串口技术的实物调试和虚拟仿真联合教学模式
基于嵌入式MINIGUI控件子类化技术的深入研究与应用