缩略图

基于多线程数据实时传输的软件设计与实现

作者

袁邦林

贵州航天控制技术有限公司 贵州贵阳 550009

1 引言

在上位机软件开发的过程中,实时通信已经应用非常广泛,尤其在军用领域或其他特殊场景,而软件是实现数据实时传输的重要组成部分,负责数据在测试设备与产品之间的双向传输,它是否能够实时、可靠地进行数据传输对产品的通信质量有着至关重要的影响。

本文基于 Windows 7 的系统和 VS2017 集成开发环境下,以及产品的特点,详细分析了软件的功能需求和性能需求。根据功能需求,采用自顶向下的设计了软件实现方案:首先根据软件设计任务书,要求能够同时对 6 套产品的测试要求,分别从硬件和软件上进行设计,软件上设计不少于待测试产品数量的线程;其次,根据产品的特点,即为组合产品,包括2 个组件级产品,共计12 个线程,每个线程接收不同的数据,并保存数据。

2 多线程数据传输技术

线程是在操作系统设计过程中根据进程中演化而来的,与进程相比,具有创建、销毁、调度开销小、可方便地共享一个进程内资源等诸多优势。在单处理器平台上实现多线程程序能够在同一时间运行多个程序轨迹,可以显著提高程序运行效率[1,2]。例如在嵌入式上位机,需要同时进行发送、处理以及接收操作,这种场景下就可以采用多线程的方式实现。但多线程程序的设计需要十分仔细,调试相对于单线程程序而言也复杂困难得多,往往存在一些问题导致程序功能紊乱、内存泄露、甚至系统崩溃。一个线程的生命周期共有5 个,有创建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)。当一个线程被创建后,该线程就处于新建状态;当线程调用 Start 方法后,线程就进入就绪状态;处于就绪状态的线程获得CPU 资源,开始执行 run 方法的线程执行体时,该线程进入运行状态;处于运行状态的线程,当失去所占用资源(包括Sleep、I/O 等待、等待锁、等待资源分配)后,便进入阻塞状态;处于阻塞状态的线程,获得资源后,则进入就绪状态;线程 Run 方法结束或发生异常、中断都会使线程进入死亡状态 [3]。

C 语言多线程实现的原理主要通过操作系统提供的线程管理函数来创建、管理和调度线程。在 Unix/Linux 系统中,可以使用 pthread 库来显示多线程,而在 Windows 系统中,可以使用 Win32 API 或者 C++11 标准库中的 std::thread 实现多线程。

3、系统设计与实现

3.1 硬件设计

整个测试系统由 PC 计算机、测控箱及测试电缆三部分组成。其工作原理图如图2 所示。

PC 计算机接收产品输出的数据,进行自检计算并显示自检结果。

测控箱由27V 电源、27V 一次、二次电源手动控制开关、27V 电源电压表、27V 电源电流表、422 串行接口箱等几部分组成。其中 27V 电源能同时为 6 套产品静态工作条件下的供电;422 串行接口箱由 3 个独立的 UPort 1450I 四口RS-422 USB 转换器组成,能够同时接收6 套产品输出的数据(包含2 个组件级产品数据);27V 一次、二次电源手动控制开关共 12 组,能按产品供电时序要求分别对 6 套产品进行供电与断电控制;27V 电源电流表能集中显示所有在测产品消耗27V 电源的电流。

将 220V 50Hz 交流电源转换分别给 3 个 UPort 1450I 和 27V 电源供电。27V供电分别一、二次分别给产品供电,最终通过测试电缆把产品输出的数据经UPort 1450I 串口传输到 PC 计算机,进行解析和显示。

3.2 软件设计

3.2.1 功能模块设计

在该测试系统中,测试软件的函数模块由通讯自检功能和测试功能两个模块。此外,在不考虑硬件故障的情况下,测试功能模块应具备测试 6 套产品的能力。

基于测试系统硬件的情况,根据产品的特点和测试的功能需求,对软件的架构进行设计。由于产品采用模块化设计,集成度比较高,由不同的组件级产品组合而成。在本文中,只需监测产品下的 2 个组件级产品的数据,因此在软件中设计了功能模块 1 和功能模块 2,分别用于接收 6 套产品中组件 1 和组件2 的测试数据,对测试数据进行解析,并保存。

3.2.2 多线程设计

在该测试软件中,多线程的应用主要应用于功能模块 1 和功能模块 2,分别用于 6 套产品的组件 1 和组件 2 的测试数据,功能模块 1 和功能模块 2 均为6 个线程,共计12 个线程对6 套产品的数据进行接收和处理。

3.2.3 软件实现(1)函数设计

初始化函数:OnInitDialog

退出函数:OnTuichu

数据接收函数:OnReceivedData(CReceiveData *pReceiveData)

开始测试函数:OnTest0

设置定时器:SetTimer(1,100,NULL)

定时器响应函数:OnTimer(UINT nIDEvent)

数据填写函数:FillForm(CFrameData FD, CString head, int line )

数据保存函数:OnSAVE

多线程代码实现部分

多线程代码实现部分,程序初始化后,创建 12 个线程,并对每一个线程对象进行编号 threadID,使每一个线程与串口 COM 一一对应,一个线程对应一个RS-422 串口,从而保证了数据的可靠性。

4 总结

串口通信技术被广泛的应用在工业、医疗、农业智能化、航空航天、汽车等领域,技术已经非常的成熟,其配置简单、高效、高可靠等特点,对不同设备间的通信提供了可能。针对产品的特殊性,本文提出了一种基于多线程数据实时传输的软件设计与实现方法,为产品的研制生产提供了保障。产品在每隔3.1ms 发送一帧数据,测试软件利用多线程技术,在接收一帧数据,在最优的情况下耗时为 0.89ms ,最坏的情况下耗时为 2.22ms ,满足了对产品的测试要求。

参考文献:

[1] 综合测试系统中串口扩展的设计与实现[J],任安虎,张燕,2010,信息技术

[2] 张雷, 王悦, 雷玉常. 基于线程同步与妥协处理机制的多线程技术[J]. 辽宁工程技术大学学报: 自然科学版 , 2012, (5)

[3] 卫 佳 栋 , 殷 联 甫 . 如 何 用 C 语 言 实 现 多 线 程 技 术 [J]. 福 建 电脑 ,2016,32(10):134-137.DOI:10.16707/j.cnki.fjpc.2016.10.071

作者简介:袁邦林(198610-),男,汉,四川省德阳人,大学本科,工程师,研究方向:电路软件设计,系统设计。