Android平台下虚拟多串口并发通信的研究
2019-07-08冉德纲孙斌杨建申兴发周红春
冉德纲 孙斌 杨建 申兴发 周红春
摘 要: 目前Android系统只提供单串口通信,在多串口并发通信方面缺乏基础功能。文章提出虚拟串口方案以解决多串口并发通信问题,将原有唯一串口通过软件接口方式虚拟出多个串口为应用程序提供服务。系统主要由Android源码框架层串口数据流分发软件和STM32微处理器单串口物理扩展外部电路两部分组成。实验结果表明,在多串口并发通信时,该系统能够提供高效、稳定、可靠的串口数据传输。
关键词: Android系统; 串口; 并发; STM32; 事件驱动模型
中图分类号:TP368.2 文献标志码:A 文章编号:1006-8228(2019)05-37-04
Abstract: At present, the Android system only provides a single serial port communication, and lacks basic functions in multiple serial port concurrent communication. This paper proposes a virtual serial port solution to solve the problem of multiple serial port concurrent communication, and the original unique serial port is virtualized as multiple serial ports by the software interface method to provide services for the application. The system is mainly composed of the serial data stream distribution software in Android source code framework layer and the physical expansion external circuit for STM32 microprocessor single serial port. The experiment results show that the system can provide efficient, stable and reliable serial port data transmission in multiple serial port communication.
Key words: Android system; serial port; concurrent; STM32; event driven model
0 引言
随着物联网技术和Android系统的不断发展,越来越多的智能设备所运行的操作系统被Android系统取代。智能设备功能不断增加,对通讯接口的需求也越来越多,其中包含以太网、CAN总线、串口、SPI、I2C等,因串行接口协议简单、兼容工业仪表和设备多、成本低、占用系统资源较少等特点在实际中被广泛应用。
现有的Android系统没有串口通信相关的接口,有关串口通信的实现大都是基于Google公司提供的串口开放源码来实现的,或者使用JNI技术封装的底层接口库实现。这些方案虽然能够满足串口端到端的通信,但无法满足当多个智能设备同时通过串口与Android系统控制器通信的场景。目前多采用专用串口扩展芯片[1]或多串口卡[2]来解决多串口并发通信问题。
一般专用串口扩展芯片都需要在系统层实现专用的驱动程序,在Android系统中添加芯片的驱动程序比较复杂,并且芯片驱动调试需要占用大量的时间。多串口卡一般由微控制器和串口扩展芯片组成,价格贵。综上,为解决Android平台多串口通讯问题,本文提出虚拟串口软件方案来满足一对多串口通信场景的需求。该方案主要由串口数据流分发软件和STM32微处理器简单串口扩展电路两部分组成。
1 系统结构
系统采用模块化设计,保证各模块之间逻辑相对独立方便后续的改进,主要由Android系统端和STM32微处理器端两大部分组成。系统框架如图1所示。
Android系统端主要由虚拟多串口数据流分发软件和JNI接口抽象封装两部分组成。虚拟多串口数据流分发软件主要功能为:监听Android系统ttyHSL1串口与应用层软件是否有数据发送和完成数据的封包、解包和转发。JNI接口[3]抽象封装主要是通过JNI技术产生与Java接口对应的C/C++本地接口,这样不同应用程序可通过Java封装的API来使用虚拟串口提供的服务。
STM32微處理器端的主要功能为串口数据采集与转发。应用层软件可通过API配置各个串口的工作参数,如波特率、奇偶校验位、数据位和停止位等,使其与外接串口设备工作参数一致。
2 Android端系统软件
为满足多串口并发数据传输实时性要求,系统采用多线程Reactor事件处理模型[4-5]来组织虚拟多串口数据流分发软件。系统启动时创建固定数目的线程,避免系统运行过程中频繁的创建与销毁线程,从而减少进程调度所消耗的资源,提高系统的处理能力。
2.1 数据流分发软件框架
基于Reactor事件处理模型[6]搭建虚拟串口服务框架实现高效的数据分发。为降低软件端数据流分发处理逻辑的复杂度,系统采用命名管道[7]进程间通信方式作为数据流转发的通道,由于管道是半双工通讯方式,数据只能从一端到达另一端,因此为实现全双工通信,需要创建两个管道,分别命名为读管道与写管道。如图2所示,系统中外接有4个串口再加上配置管道,因此总共需要创建10个管道来实现数据的转发。
图2所示,系统启动时创建两个线程,其中一个线程监听系统ttyHSL1串口句柄上的事件,另一个线程监听已创建5个读管道句柄上的事件。
2.2 先来先服务调度算法
虚拟多串口数据流分发软件采用先来先服务FCFS调度算法[9]完成多串口数据的转发任务。算法主要思想是依照作业到达的先后次序组成一个就绪队列,调度器首先选择队头的任务并为其分配处理机,直到任务运行结束或发生中断被阻塞,处理器会重新调度其他任务。调度算法如表1所示。
2.3 数据封装协议
为保证数据传输的可靠性,我们定义了数据封包解包私有协议。协议由包起始标记、功能码、包体长度、包体、CRC校验码和包结束标记组成。
其中包起始和结束标记为固定值,分别为48484A4A和4A4A4848,应用程序通过查找起始和结束标记来确定整个数据包。功能码(FN)表示数据包功能,如FN为1表示APP设置串口配置参数;FN为2表示APP获取串口配置信息;FN为3表示APP向设备发送数据;FN为4表示设备向APP发送数据。CRC校验码是使用CRC校验算法[8]计算的數据包CRC值,以此保证每个数据的正确性与完整性。
3 STM32微处理器端
系统采用基于ARM Cortex?-M3内核的STM32F101RC这款芯片实现串口物理扩展,将原有的1个串口扩展为4个串口,使Android系统应用程序能够同时与4个串口设备并发通信。
STM32F101RC该型号微处理器属于STM32增强型系列,具有外设丰富、价格低廉、性价比高等优点。在串口外设资源方面可提供5路串口,其中3个为通用同步/异步接收器发送器,另外2个为通用异步接收器发送器。
3.1 双缓冲区设计
系统采用双缓冲区设计思想[9]存储串口接收到的数据,具体工作流程为:首先将接收到的数据先放入第一个缓冲区中直到缓冲区满或者处理器要发送此串口中的数据,然后切换缓冲区,将接收到的数据放入第二个缓冲区,此时处理器可以处理第一个缓冲区中的数据。当第二个缓冲区存满数据或下次调度到来时,调整缓冲区指针,将接收到的数据放入第一个缓冲区,此时处理器处理第二缓冲区中的数据。重复使用两个缓冲区来接收数据和处理数据,具体缓冲区配置情况如图3所示。
3.2 最小剩余空间优先MRSF调度算法
在STM32微处理器端,我们提出最小剩余空间优先MRSF(Minimum Remaining Space First)调度算法来调度4个外接串口。
最小剩余空间优先MRSF调度算法主要思想是根据每个串口缓冲区剩余空间大小和等待发送时间来确定该串口的优先级,缓冲区剩余空间越小,等待时间就越长,其被分配的优先级越高,反之优先级越低。处理器在调度前,先计算每个串口的优先级,优先调度是为优先级最高的串口分配处理器,该任务一旦得到处理器,就一直运行直到任务结束。每个串口整体优先级计算公式如下:
其中,Ps代表根据缓冲区剩余空间因素计算得到的优先级,Pt代表根据时间因素计算得到的优先级,而Pl代表最终的优先级,它是两种优先级的数值求和。算法伪代码如表2所示。
4 实验测试
为测试本文提出的多串口并发通信方案的正确性、高效性和稳定性,我们开发了一个Android串口应用APP,用于数据的接收和转发。笔记本电脑(Lenovo Y470)充当传感器设备通过串口与APP进行串口通信,数据收发采用回环测试方案,即APP收到数据后原样返回。
电脑端打开多个串口调试软件来模拟多台串口设备,串口配置参数为波特率115200、无校验、数据位8位、停止位1位,每次发送固定大小32字节的数据,实验环境如图4所示。实验结果显示,在3个串口分别以200、300、400毫秒周期速率并发传输场景下,该系统同样能稳定的传输数据。
5 结束语
本文主要介绍了一种在Android平台下实现多串口并发通信的方案,通过在Android源码框架端添加虚拟串口数据流分发软件结合STM32微处理器简单多串口物理扩展电路实现多串口并发通信。实验结果表明该系统在稳定性、传输效率、误码率等方面都有很好的表现。在智能售获机、自助取件柜等产品中具有很好的应用前景。
现阶段微处理器端采用前后台系统(超循环系统)模式来组织应用程序,系统整体不够健壮。未来将通过移植uC/OS-II实时操作系统[10]来管理和调度各个任务,以此来提高系统的实时性和整体稳定性。
参考文献(References):
[1] 张达,郭银博,赵广宇,胥勋伟.基于WK2168的气象采集站多串口采集方案的设计与实现[J].电脑知识与技术,2018.14(19):284-286
[2] 周敏.多串口卡在民航通信系统的综合应用[J].科技与创新,2014.20:143-143
[3] 罗尹奇,刘力银.基于JNI的Java串口通信系统的设计与实现—以Windows平台为例[J].电脑知识与技术,2017.13(34):51-56
[4] Schmidt D C. Reactor: an object behavioral pattern for concurrent event demultiplexing and event handler dispatching[M] Pattern languages of program design. ACM Press Addison-Wesley Publishing Co.,1995
[5] 陈硕.Linux多线程服务端编程:使用muduo C++网络库[M].电子工业出版社,2013.
[6] 游双.Linux高性能服务器编程[M].机械工业出版社,2013.
[7] 乔静,刘宝旨,屈志强等.Linux中命名管道通信浅析[J].中国科技信息,2009.20:97-98
[8] 常晓明,王建东.CRC校验及其软件实现[J].电子技术应用,1995.6:14-14
[9] 汤子瀛,哲凤屏,汤小丹.计算机操作系统[M].西安电子科技大学出版社,2001.
[10] 沙德鹏,彭刚.基于uC/OS的一种嵌入式系统的构建[J].自动化与仪表,2018.33(4):91-94