3.2 Qt
信号通信机制
作为一款上位机控制软件,与通过指令收发的形式与下位机进行通信是其主要职能。
使用
Qt
开发,首先要考虑通信问题。信号与槽(
Signal & Slot
)机制是
Qt
软件独创的
一种通信方式
[16]
。信号类似与一个开关,而槽函数类似于一个灯泡。当开关触发后,灯
泡开始工作。信号与槽也是如此
[17]
。当表示信号函数的事件触发后,比如点击一个按钮,
就会发出一个信号,需要实现的目的就是槽函数要表达的信息。它隐藏了复杂的底层实
现,完成信号和槽的关联后,发射信号并不需要知道
Qt
是如何找到槽函数的
[18]
。与某
些开发框架的回调函数(
callbacl
)相比,信号与槽这种机制更加灵活多变,也让
Qt
在
界面设计时,对各个组件的编程目标更加明确。
信号和槽函数是用
QObject::connect()
函数进行连接的的。一般写成:
QObject::connect(sender,SIGNAL(signal()),recevier,SLOT(slot()));
或者
connect(sender,SIGNAL(signal()),recevier,SLOT(slot()));//QObject
可省略
在上面的函数中,
sender
表示发出信号的控件名,
signal()
是该信号的名称。比如按
钮的点击,文本框的输入等。同理,
recevier
表示接收信号的类名称,可以是窗体,或
者对话框等。
slot()
函数为相对应的槽函数,表明接收信号的类要执行的操作
[19]
。可以是
窗体的弹出,或者显示一段文本。在使用信号和槽函数机制进行编程时,需要明确以下
内容:
4.
一个信号允许与数个槽函数进行配对,数个信号也能够关联相同的槽函数
[20]
。信
号与槽函数之间并没有固定的数目匹配。需要注意的是,当一个信号与几个槽函数连接
时,槽函数的实现需要参照具体程序,根据程序中关系的先后依次进行。这种一对多,
多对一的对应关系可以用图
3.2
表示。
5.
不同信号之间也能够互相建立关系。并不是信号必须对应槽函数。信号也可以触
发另一个信号,再去响应一个或几个槽函数,可以根据具体的情况灵活运用
[21]
。
6.
信号与槽函数的关联方式是很迅速的、即时的。类似于中断,当触发了一个信号
槽函数时,会立刻执行。只有这个槽函数执行完毕,主程序才会继续运行
[22]
。
信号与槽函数的通信机制是
Qt
编程的根本原则。除此之外,还有一些函数需要事件
去触发。比如鼠标操作和键盘的键入。这些操作在
Qt
中都有对应的函数来响应。图
3.3
为常见的几种事件处理函数
[23]
。
3.3
软件程序界面的设计和实现
根据
Qt
的通信机制,结合项目需求,软件除开机界面外,设计为三个功能窗口。分
别是模拟源窗口、数据回读窗口、数据分离窗口。
3.3.1
开机界面
开机界面显示软件名称和版本号以及软件功能入口。包括模拟源窗口、数据回读窗
口、数据分离窗口三个功能窗口。每个窗口都是功能独立,互不干扰。使用时,可以根
据具体需求选择对应的的功能按钮。开机界面如图
3.4
所示。
3.3.2
地面数据模拟窗口
地面数据模拟是整个系统的必要一环。在飞行试验前,有必要用模拟数据来检测记
录仪的工作情况。模拟源分为手动和自动两种模式。模拟源窗口界面如图
3.5
所示。
点击系统上电后,软件发指令给
CPU
,控制继电器工作,系统上电。手动模式下可
以自由选择任意开关量和模拟量进行测试,方便检查系统某一路是否故障。自动模式下,
软件只发送一条指令。
CPU
收到指令后,会自动上电,依次启动各路开关量和模拟量数
据,并记录在存储器中,实现操作自动化。测试台上都有相应的信号灯显示某一路开关
是否打开。右边窗口显示即时操作信息和反馈信息。
模拟源模式的工作时间可以自行控制,通常试验时间为
3-5
分钟。其中,每一路开
关量数据的开关时间均以数据的形式存存储器中,回读后可以通过数据直观的看到每个
开关的启动时间和顺序。图
3.4
中
<
系统上电
>
和
<
自动模式
>
按钮均为为复用按钮,点击
一次就会变
<
系统断电
>
和
<
停止测试
>
。测试台中的主控
CPU
负责对收到的数据进行总
体的编帧存储。
3.3.3
数据回读窗口
数据回读是整个软件功能的核心部分。负责将已经编帧并存储到
Flash
中的数据回
读到上位机。硬件接口为百兆以太网接口芯片
W5300
,采用
UDP
协议进行回读。回读
后的数据存储到桌面上,数据格式为
.hex
文件。窗口界面如图
3.6
所示。
首先点击
<
系统上电
>
按钮,然后配置网络
IP
和端口号。点击
<
连接
>
按钮,界面显
示当前网络连接状态。接着选择存储器。系统装配有两个存储器芯片,且均有备份,确
保数据保存完整。点击
<
读取记录器信息
>
按钮,会在界面显示当前存储器的存储状态,
包括上电次数,数据大小等信息,用户可根据显示的信息选择读取次数和读取量,点击
<
读主存储器
>
或者
<
读备存储器
>
开始读数。数据会保存到桌面,以读取时间命名。读取
结束后,文本框内会有提示。最后点击
<
停止读数
>
按钮,使
FPGA
端空闲。用户也可以
根据情况选择擦除存储器。界面右侧文本框内容为操作步骤。每一步操作和反馈均在下
方文本框内即时显示。每个按钮在上一步操作未完成之前,都是灰色不可用的,这样做
的目的是为了防止用户误操作。读取结束后点击
<
退出
>
按钮,退出当前界面,返回主界
面,执行下一步操作。
3.3.4
数据分离窗口
数据分离窗口的主要功能是对已经回读的原始数据文件进行分离。数据分离窗口界
面如图
3.7
所示。
图中每一个按钮都代表分离一路数据。点击每个按钮,自动弹出文件索引窗口,选
择分离已经回读的任意一次原始数据。分离结束后,弹出信息提示框表明分离结束。输
出的子数据文件存放到桌面上。通过分离数据,进一步观察分析每一路数据,与预先设
定好的模拟数据作对比,进而对整个系统的运行情况作出结论。
数据分离基本思路是按照不同通道数据的帧头进行分离。由于每个通道的数据都是
独立互不影响的,且数据格式固定,即帧头
+
帧计数
+
数据
+
校验和。所以按照帧头判断
可以很准确的将原始数据分离开来。分离过程程序设计流程图如图
3.8
所示。
深圳信迈提供RK3399+FPGA的软硬件方案。
5.1
软件功能测试
将开发板与测试台连接,包括开发板电源
12V
由测试台提供。串口、网口与测试台
连接。接通测试台电源,可以看到测试台电压显示窗口数值稳定为
27.7V
,表明电源、
串口、网口接通状态的指示灯都为绿色。系统硬件连接如图
5.1
所示。
打开软件,首先选择进入模拟源工作模式。点选
<
手动模式
>
。依次点击各个开关量
模拟量按钮,工作时间设为
5
分钟。软件工作界面如图
5.2
。窗口即时显示操作信息。
系统工作结束,开始回读数据。在软件数据回读界面,按照提示框内的操作流程进
行读数配置。工作界面如图
5.3
所示。
数据回读后自动存到桌面上,生成以存储时间命名的数据源文件。文章来源:https://www.toymoban.com/news/detail-482546.html
5.2
测试结果
将回读成功的数据从
rk3399
提供的
USB
口传输到
PC
端。通过数据解析软件处理,
按各通道数据帧头将原始数据分离,最终输出
7
路数据。用
Hexedit
和
Matlab
软件进行
查看和处理,得到对应的数据源码和波形图。每一路数据前
8
个字节中,
4
个字节为数
据帧头,
4
个字节为帧计数,在原始数据中都可以直观的看出。
7.
开关量和模拟量测试结果如图
5.4
所示。数据帧头
F1F20000
,频率
100Hz
,帧计
数间隔为
2
。
文章来源地址https://www.toymoban.com/news/detail-482546.html