1. 引言
在数据采集系统中,双串口通信是一种常见的需求,尤其是涉及系统同时采集多个外部设备数据时的场景。双串口通信能够使数据采集系统独立、并行地与多个外部设备进行数据交换,避免了数据延迟、提高了系统的实时性。同时,它解决了数据采集系统中的多设备管理、复杂通讯协议拆分、数据集中分析处理等问题,提高了数据传输的效率和系统的灵活性与可靠性[1]。
当前研究中,实现多串口通信的方案可分为硬件和软件两种。硬件方案包括专用多串口卡[2]、嵌入式系统的多串口控制器[3]-[5]和FPGA [6]等。专用多串口卡通过增加多个串口来提供高稳定性和实时性,适用于高并发的工业自动化和数据采集系统,但成本较高,扩展性差。嵌入式系统(如ARM、DSP)通过集成多个串口进行并行通信,功耗低、集成度高,但开发周期长,灵活性较差。FPGA方案则通过硬件编程实现极高的实时性和并发处理能力,适用于高速数据采集,但其开发难度较大且成本较高。与硬件方案相比,软件方案更具灵活性和成本优势。例如使用操作系统自带的串口应用程序接口(Application Programming Interface, API)开发[7],该方法操作简单,但在多串口处理时可能存在阻塞问题,无法充分发挥并发性能。使用第三方软件开发如LabVIEW [8],其提供了丰富的图形化界面和模块,适用于原型设计,但实时性较差。Python中的pyserial库因其简单易用、功能强大、开源等优点[9],成为一种常见的串口通信解决方案,可以灵活运用于小型数据采集系统,缩短开发周期,节省成本。
根据上述论点,本文分析了基于Python的双串口通信实现原理,并通过人体站立平衡反馈实验数据采集系统的设计案例,详尽阐述了基于Python的双串口数据采集系统的设计流程。系统功能验证表明,该数据采集系统不仅有效地执行了实验数据采集、分析、存储和数据可视化等核心任务,而且实现了主机与多模块间的数据交互,从而简化了实验操作流程,并满足了多串口通信的需求。这一设计在实际工程当中具有一定的应用价值。
2. 基于Python的双串口通信实现原理
基于Python的双串口通信系统软件架构采用分层设计的原则,以保证整个系统的可维护性、可扩展性和模块化。系统的架构由上至下主要由数据访问层、业务逻辑层、表现层构成,如图1。
数据访问层:在双串口通信系统中,数据访问层负责与串口硬件进行底层数据交互,并实现串口初始化、数据读写、状态监控和错误处理等功能;
业务逻辑层:业务逻辑层是双串口通信系统的核心,它负责处理串口通信的核心业务规则和逻辑,主要实现了数据解析与封装、通信协议处理、数据流转控制、业务规则实施和日志等功能;
表现层:在双串口通信系统中其主要实现了用户端的界面支持、请求响应、反馈与交互以及数据展示等功能。
Figure 1. Software layered architecture
图1. 软件分层架构图
2.1. Pyserial库调用与数据访问层实现
在Python中对串口进行的操作是通过调用pyserial库来实现的。pyserial库是Python第三方库,支持Windows、OS X、Linux等多种操作系统。通过pyserial库的API函数可以实现数据访问层所需的串口的初始化、数据读写和状态监控等各项功能。
串口初始化时,通过创建不同的serial对象并配置端口号、波特率、数据位、停止位及校验位等参数,确保与实际硬件匹配,实现串口的正确连接。数据读写功能利用pyserial封装的API函数实现,使用open()、close()函数控制打开或关闭串口,使用write()和read()函数按字节读取串口数据。通过读取in_waiting变量获取串口缓冲区的可读数据的字节数,使用timeout参数设置数据读取的超时时间。对于可能出现的异常情况,如端口打开失败、数据传输错误、超时等,需要在程序中触发异常类serial.SerialException来帮助识别错误类型。使用try-except块,先执行打开、关闭等相应的串口操作程序,当程序执行失败时触发serial.SerialException来捕获异常。当出现异常时,通过提前设置的重试次数和间隔时间,重新执行相应的串口操作程序。对于某些可恢复的错误,重试机制可以提高数据传输的稳定性。
2.2. 基于Threading库与多线程的数据流转控制
多串口在收发数据时通常会遇到数据阻塞、数据并发处理、响应时间要求高以及业务逻辑复杂等诸多问题,此时就需要引入多线程机制来进行数据的流转控制。多线程编程可以确保每个串口的操作都能独立进行,不会相互干扰,从而提高系统的响应速度和可靠性。
在Python中,threading模块提供了一个高级的、基于线程的并发性接口,能够实现系统的多线程处理。同时双串口通信作为IO密集型任务,在能够避开Python当中全局解释器锁(Global Interpreter Lock, GIL)同一时间只有一个线程可以执行Python字节码的限制,使得多线程在IO等待期间实现有效的并发处理,从而提高系统的整体性能和响应能力。
为实现并发数据处理,系统通过threading库为每个串口创建独立线程来处理数据收发。每个线程使用thread.start()启动,并通过thread.join()确保主线程在所有子线程完成后继续执行。为了避免多线程访问共享串口资源时发生冲突,采用threading.Lock来保证同一时间只有一个线程能进行读写操作,从而确保数据的正确性与线程安全。
2.3. 基于Qt和Matplotlib库的用户界面设计
Qt是一个成熟的跨平台C++框架,提供了丰富的图形用户界面(Graphical User Interface, GUI)组件、事件管理和布局机制。Python中通过PyQt库可以访问Qt的所有功能,PyQt使得开发者能够在Python环境下开发复杂的GUI应用。Matplotlib则是Python中一个功能强大的绘图库,能够生成静态、动态以及交互式图形,广泛应用于数据可视化领域。
在实际的GUI开发过程中,常使用Qt Designer进行用户界面的设计,Qt Designer通过可视化操作简化了界面的布局和控件的配置。界面中的控件通过PyQt与Python脚本进行绑定,用户可以在界面上配置串口参数,并实时查看串口通信状态。为了实现采集数据的动态可视化,界面中将Matplotlib绘制的曲线通过FigureCanvas类嵌入到Qt Designer中的QWidget绘图区域,来展示实时数据曲线。
Qt的信号(signals)和槽(slots)机制是实现界面交互的核心。每当串口接收到数据时,串口读取线程通过发出信号将数据传递给主界面。主界面中的槽函数接收数据,并对其进行解析和更新,最终通过Qt的GUI组件实时展示数据。此机制确保了数据处理与界面更新的高效同步。
利用Qt结合Matplotlib的方案不仅能够满足数据交互与实时显示的需求,还通过信号和槽的异步通信机制,避免了界面卡顿,提升了系统的响应速度和用户体验。
3. 双串口数据采集系统设计与实现
为了进一步双串口通信方案的可行性,本文以人体站立平衡反馈实验[10]为例,为该实验系统设计了一个基于Python的双串口数据采集系统。
3.1. 系统结构
人体站立平衡反馈实验的数据采集系统结构如图2所示。穿戴在人体上的IMU (惯性测量单元,Inertial Measurement Unit)传感器模块通过串口向计算机实时发送人体站姿数据,计算机将站姿数据分析和处理后,将相应控制信号通过另一串口发送至温度反馈模块,同时温度反馈模块将实时温度信息传回计算机。人体通过感知反馈模块的温度变化,判断自身当前的站立姿态,以便调整站姿并保持站立平衡。
Figure 2. Structure of human standing balance feedback experiment data acquisition system
图2. 人体站立平衡反馈实验数据采集系统结构图
3.2. 系统硬件
在人体站立平衡反馈的实验中,实验穿戴装置主要使用了IMU十轴姿态传感器、TCM数字温控模块及相关外围硬件,两模块分别用于采集人体姿态数据和提供温度反馈。
TCM温控器是温控模块的核心器件,它采集外接的温度传感器数据与内部设定温度进行比较,再通过内部控制算法产生电压差作用于帕尔贴上,最终实现对目标的温度控制。温控器采用RS232三针(1 COM; 2 RXD; 3 TXD)接口并使用RS232协议与电脑进行通讯。图3为TCM数字温控模块的结构图。
Figure 3. Temperature control module structure diagram
图3. 温控模块结构图
Figure 4. Main program block diagram
图4. 主程序框图
IMU传感器集成模块是基于MEMS (微电子机械系统,Micro-electromechanical Systems)技术的高性能三维运动姿态测量模块,模块内部自带卡尔曼滤波、高精度校准和标定算法。模块采用串口通信,波特率4800~921,600可调。
3.3. 程序设计
根据软件分层架构,将人体站立平衡反馈实验系统的程序进行分层和模块化设计,程序在每一层分别实现了如下功能:
数据访问层:根据温控模块及IMU模块的通信参数要求封装了两个串口模型,实现了上位机对两个串口的初始化、串口控制、数据读写、错误处理等功能;
业务逻辑层:根据通信协议对串口数据进行解析与处理,将IMU采回数据进行存储,同时该层还实现了整个系统的多线程处理和温度反馈控制逻辑;
表现层:实现了温控模块与IMU模块串口参数配置的可视化,以及温度和IMU采回的加速度数据曲线的实时显示。
主程序的程序框图如图4所示。该框图描述了整个系统的主要工作流程。
系统启动后初始化设备模型并将与IMU和温控模块连接的两个串口进行参数配置;打开串口后首先对两个模块进行校准并设置初始工作状态,随后开始循环更新数据并引入判断逻辑和温度调节过程,系统工作过程中的数据会被实时存储,并在接收到关闭设备信号关闭串口后,将数据记录在文件当中。
为了避免在读取IMU数据时频繁操作串口导致程序阻塞在程序中使用了多线程编程,本方案中将主程序作为主线程,其负责执行串口资源的配置与调用、分支线程的创建与调用等任务。分支线程作为输入处理线程,从串口读出数据并将数据传送给主线程。多线程的引入可以让耗时的IO任务转到分支线程中执行,在此期间主线程可以执行其他任务。
3.4. 上位机界面设计
上位机界面主要实现了对温控模块与IMU模块的串口参数可视化配置,以及实时显示IMU采集的加速度数据曲线和实时温度信息,方便实验人员的使用。
用户界面具体的设计过程是:使用Qt Designer工具完成界面的绘制并生成文件;根据界面功能编辑信号与槽函数,实现界面与主程序的逻辑连接;最终将界面文件生成为可执行的应用程序。
4. 系统功能验证
根据人体站立平衡反馈实验数据采集系统的设计实例,本文结合系统硬件进行了实验测试,对整个系统的功能和双串口通信性能进行了验证,包括:结合用户界面和系统存储功能验证系统是否成功收到IMU和温控模块两个串口的数据;在实验条件下对系统数据的传输速率、准确性以及系统的稳定性是否满足实验要求进行验证。
4.1. UI界面功能验证
将硬件与电脑用串口相连,在电脑上运行Qt Designer生成的可执行文件。此时,在打开的UI界面上配置串口参数,两个串口的端口号、波特率、数据位、校验位等参数信息分别要与实际的硬件模块相匹配。最终配置完成的串口参数:IMU连接端口COM3、波特率为115,200;温控模块连接端口COM4、波特率为9600。
参数配置完成后点击打开串口,此时系统软件正常运行,观察到曲线绘制窗口产生了当前加速度数据生成的图像信息,温度窗口则成功显示当前温控模块传回的温度信息,如图5所示。
Figure 5. UI interface display
图5. UI界面显示
4.2. 数据存储功能验证
在系统运行程序结束后,在程序内设定的存储路径下,可以观察到IMU传回的时间、加速度等信息和温控模块传回的温度信息成功保存在文本文件中,如图6所示。通过时间数据可得系统每10 ms更新一次加速度和温度等参数信息,满足实验要求。
Figure 6. Data storage function test
图6. 数据存储功能测试
4.3. 数据传输稳定性与准确性验证
依据[10]中的实验方法,使设备工作在实验条件下,待硬件与采集系统成功连接并开始工作后,连续采集数据并通过适当地摆动改变IMU的位姿,单次采集过程持续5分钟,并进行多次试验。在程序中加入校验计数功能,当数据未通过CRC (循环冗余码校验,Cyclic Redundancy Check)校验时计数值加一,实验结束时输出未通过校验的次数。其中三次试验的计数结果见表1。
Table 1. Data transmission verification
表1. 数据传输验证
序号 |
未通过校验的次数 |
准确率 |
1 |
0 |
100% |
2 |
0 |
100% |
3 |
0 |
100% |
实验结果表明,该双串口数据采集系统能够稳定地采集两个串口的数据,同时系统在运行过程中未产生数据报错,数据传输的准确性较高,系统基本能够满足实际数据采集的需求。
5. 结论
为了解决工程应用中数据采集系统的多串口通信需求,本文提出了使用Python语言和串口库方式实现双串口通信的技术方案。文章分析了基于Python的双串口通信实现原理,提出了一个基于Python的人体站立平衡反馈实验系统软件的设计实例,通过将系统与实际硬件相结合进行实验测试,验证了该系统的可行性与实用性。实验表明,该系统软件实现了可靠的双串口通信性能,可以稳定地采集数据并进行实时处理,能够满足系统的功能需求。该方法简化了人体平衡实验的实验流程,方便实验者对数据进行采集分析。同时该系统的设计和实现方法为解决多串口通信问题提供了一个有效的解决方案,具有较高的实用价值和推广潜力。在未来的研究中,将在系统功能的拓展、算法融合和系统安全性等方面进一步完善和优化系统的性能,增强其在高负载和复杂环境下的稳定性和可靠性。
NOTES
*通讯作者。