冉德綱 孫斌 楊建 申興發(fā) 周紅春
摘? 要: 目前Android系統(tǒng)只提供單串口通信,在多串口并發(fā)通信方面缺乏基礎功能。文章提出虛擬串口方案以解決多串口并發(fā)通信問題,將原有唯一串口通過軟件接口方式虛擬出多個串口為應用程序提供服務。系統(tǒng)主要由Android源碼框架層串口數(shù)據(jù)流分發(fā)軟件和STM32微處理器單串口物理擴展外部電路兩部分組成。實驗結(jié)果表明,在多串口并發(fā)通信時,該系統(tǒng)能夠提供高效、穩(wěn)定、可靠的串口數(shù)據(jù)傳輸。
關(guān)鍵詞: Android系統(tǒng); 串口; 并發(fā); STM32; 事件驅(qū)動模型
中圖分類號: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 引言
隨著物聯(lián)網(wǎng)技術(shù)和Android系統(tǒng)的不斷發(fā)展,越來越多的智能設備所運行的操作系統(tǒng)被Android系統(tǒng)取代。智能設備功能不斷增加,對通訊接口的需求也越來越多,其中包含以太網(wǎng)、CAN總線、串口、SPI、I2C等,因串行接口協(xié)議簡單、兼容工業(yè)儀表和設備多、成本低、占用系統(tǒng)資源較少等特點在實際中被廣泛應用。
現(xiàn)有的Android系統(tǒng)沒有串口通信相關(guān)的接口,有關(guān)串口通信的實現(xiàn)大都是基于Google公司提供的串口開放源碼來實現(xiàn)的,或者使用JNI技術(shù)封裝的底層接口庫實現(xiàn)。這些方案雖然能夠滿足串口端到端的通信,但無法滿足當多個智能設備同時通過串口與Android系統(tǒng)控制器通信的場景。目前多采用專用串口擴展芯片[1]或多串口卡[2]來解決多串口并發(fā)通信問題。
一般專用串口擴展芯片都需要在系統(tǒng)層實現(xiàn)專用的驅(qū)動程序,在Android系統(tǒng)中添加芯片的驅(qū)動程序比較復雜,并且芯片驅(qū)動調(diào)試需要占用大量的時間。多串口卡一般由微控制器和串口擴展芯片組成,價格貴。綜上,為解決Android平臺多串口通訊問題,本文提出虛擬串口軟件方案來滿足一對多串口通信場景的需求。該方案主要由串口數(shù)據(jù)流分發(fā)軟件和STM32微處理器簡單串口擴展電路兩部分組成。
1 系統(tǒng)結(jié)構(gòu)
系統(tǒng)采用模塊化設計,保證各模塊之間邏輯相對獨立方便后續(xù)的改進,主要由Android系統(tǒng)端和STM32微處理器端兩大部分組成。系統(tǒng)框架如圖1所示。
Android系統(tǒng)端主要由虛擬多串口數(shù)據(jù)流分發(fā)軟件和JNI接口抽象封裝兩部分組成。虛擬多串口數(shù)據(jù)流分發(fā)軟件主要功能為:監(jiān)聽Android系統(tǒng)ttyHSL1串口與應用層軟件是否有數(shù)據(jù)發(fā)送和完成數(shù)據(jù)的封包、解包和轉(zhuǎn)發(fā)。JNI接口[3]抽象封裝主要是通過JNI技術(shù)產(chǎn)生與Java接口對應的C/C++本地接口,這樣不同應用程序可通過Java封裝的API來使用虛擬串口提供的服務。
STM32微處理器端的主要功能為串口數(shù)據(jù)采集與轉(zhuǎn)發(fā)。應用層軟件可通過API配置各個串口的工作參數(shù),如波特率、奇偶校驗位、數(shù)據(jù)位和停止位等,使其與外接串口設備工作參數(shù)一致。
2 Android端系統(tǒng)軟件
為滿足多串口并發(fā)數(shù)據(jù)傳輸實時性要求,系統(tǒng)采用多線程Reactor事件處理模型[4-5]來組織虛擬多串口數(shù)據(jù)流分發(fā)軟件。系統(tǒng)啟動時創(chuàng)建固定數(shù)目的線程,避免系統(tǒng)運行過程中頻繁的創(chuàng)建與銷毀線程,從而減少進程調(diào)度所消耗的資源,提高系統(tǒng)的處理能力。
2.1 數(shù)據(jù)流分發(fā)軟件框架
基于Reactor事件處理模型[6]搭建虛擬串口服務框架實現(xiàn)高效的數(shù)據(jù)分發(fā)。為降低軟件端數(shù)據(jù)流分發(fā)處理邏輯的復雜度,系統(tǒng)采用命名管道[7]進程間通信方式作為數(shù)據(jù)流轉(zhuǎn)發(fā)的通道,由于管道是半雙工通訊方式,數(shù)據(jù)只能從一端到達另一端,因此為實現(xiàn)全雙工通信,需要創(chuàng)建兩個管道,分別命名為讀管道與寫管道。如圖2所示,系統(tǒng)中外接有4個串口再加上配置管道,因此總共需要創(chuàng)建10個管道來實現(xiàn)數(shù)據(jù)的轉(zhuǎn)發(fā)。
圖2所示,系統(tǒng)啟動時創(chuàng)建兩個線程,其中一個線程監(jiān)聽系統(tǒng)ttyHSL1串口句柄上的事件,另一個線程監(jiān)聽已創(chuàng)建5個讀管道句柄上的事件。
2.2 先來先服務調(diào)度算法
虛擬多串口數(shù)據(jù)流分發(fā)軟件采用先來先服務FCFS調(diào)度算法[9]完成多串口數(shù)據(jù)的轉(zhuǎn)發(fā)任務。算法主要思想是依照作業(yè)到達的先后次序組成一個就緒隊列,調(diào)度器首先選擇隊頭的任務并為其分配處理機,直到任務運行結(jié)束或發(fā)生中斷被阻塞,處理器會重新調(diào)度其他任務。調(diào)度算法如表1所示。
2.3 數(shù)據(jù)封裝協(xié)議
為保證數(shù)據(jù)傳輸?shù)目煽啃?,我們定義了數(shù)據(jù)封包解包私有協(xié)議。協(xié)議由包起始標記、功能碼、包體長度、包體、CRC校驗碼和包結(jié)束標記組成。
其中包起始和結(jié)束標記為固定值,分別為48484A4A和4A4A4848,應用程序通過查找起始和結(jié)束標記來確定整個數(shù)據(jù)包。功能碼(FN)表示數(shù)據(jù)包功能,如FN為1表示APP設置串口配置參數(shù);FN為2表示APP獲取串口配置信息;FN為3表示APP向設備發(fā)送數(shù)據(jù);FN為4表示設備向APP發(fā)送數(shù)據(jù)。CRC校驗碼是使用CRC校驗算法[8]計算的數(shù)據(jù)包CRC值,以此保證每個數(shù)據(jù)的正確性與完整性。
3 STM32微處理器端
系統(tǒng)采用基于ARM Cortex?-M3內(nèi)核的STM32F101RC這款芯片實現(xiàn)串口物理擴展,將原有的1個串口擴展為4個串口,使Android系統(tǒng)應用程序能夠同時與4個串口設備并發(fā)通信。
STM32F101RC該型號微處理器屬于STM32增強型系列,具有外設豐富、價格低廉、性價比高等優(yōu)點。在串口外設資源方面可提供5路串口,其中3個為通用同步/異步接收器發(fā)送器,另外2個為通用異步接收器發(fā)送器。
3.1 雙緩沖區(qū)設計
系統(tǒng)采用雙緩沖區(qū)設計思想[9]存儲串口接收到的數(shù)據(jù),具體工作流程為:首先將接收到的數(shù)據(jù)先放入第一個緩沖區(qū)中直到緩沖區(qū)滿或者處理器要發(fā)送此串口中的數(shù)據(jù),然后切換緩沖區(qū),將接收到的數(shù)據(jù)放入第二個緩沖區(qū),此時處理器可以處理第一個緩沖區(qū)中的數(shù)據(jù)。當?shù)诙€緩沖區(qū)存滿數(shù)據(jù)或下次調(diào)度到來時,調(diào)整緩沖區(qū)指針,將接收到的數(shù)據(jù)放入第一個緩沖區(qū),此時處理器處理第二緩沖區(qū)中的數(shù)據(jù)。重復使用兩個緩沖區(qū)來接收數(shù)據(jù)和處理數(shù)據(jù),具體緩沖區(qū)配置情況如圖3所示。
3.2 最小剩余空間優(yōu)先MRSF調(diào)度算法
在STM32微處理器端,我們提出最小剩余空間優(yōu)先MRSF(Minimum Remaining Space First)調(diào)度算法來調(diào)度4個外接串口。
最小剩余空間優(yōu)先MRSF調(diào)度算法主要思想是根據(jù)每個串口緩沖區(qū)剩余空間大小和等待發(fā)送時間來確定該串口的優(yōu)先級,緩沖區(qū)剩余空間越小,等待時間就越長,其被分配的優(yōu)先級越高,反之優(yōu)先級越低。處理器在調(diào)度前,先計算每個串口的優(yōu)先級,優(yōu)先調(diào)度是為優(yōu)先級最高的串口分配處理器,該任務一旦得到處理器,就一直運行直到任務結(jié)束。每個串口整體優(yōu)先級計算公式如下:
其中,Ps代表根據(jù)緩沖區(qū)剩余空間因素計算得到的優(yōu)先級,Pt代表根據(jù)時間因素計算得到的優(yōu)先級,而Pl代表最終的優(yōu)先級,它是兩種優(yōu)先級的數(shù)值求和。算法偽代碼如表2所示。
4 實驗測試
為測試本文提出的多串口并發(fā)通信方案的正確性、高效性和穩(wěn)定性,我們開發(fā)了一個Android串口應用APP,用于數(shù)據(jù)的接收和轉(zhuǎn)發(fā)。筆記本電腦(Lenovo Y470)充當傳感器設備通過串口與APP進行串口通信,數(shù)據(jù)收發(fā)采用回環(huán)測試方案,即APP收到數(shù)據(jù)后原樣返回。
電腦端打開多個串口調(diào)試軟件來模擬多臺串口設備,串口配置參數(shù)為波特率115200、無校驗、數(shù)據(jù)位8位、停止位1位,每次發(fā)送固定大小32字節(jié)的數(shù)據(jù),實驗環(huán)境如圖4所示。實驗結(jié)果顯示,在3個串口分別以200、300、400毫秒周期速率并發(fā)傳輸場景下,該系統(tǒng)同樣能穩(wěn)定的傳輸數(shù)據(jù)。
5 結(jié)束語
本文主要介紹了一種在Android平臺下實現(xiàn)多串口并發(fā)通信的方案,通過在Android源碼框架端添加虛擬串口數(shù)據(jù)流分發(fā)軟件結(jié)合STM32微處理器簡單多串口物理擴展電路實現(xiàn)多串口并發(fā)通信。實驗結(jié)果表明該系統(tǒng)在穩(wěn)定性、傳輸效率、誤碼率等方面都有很好的表現(xiàn)。在智能售獲機、自助取件柜等產(chǎn)品中具有很好的應用前景。
現(xiàn)階段微處理器端采用前后臺系統(tǒng)(超循環(huán)系統(tǒng))模式來組織應用程序,系統(tǒng)整體不夠健壯。未來將通過移植uC/OS-II實時操作系統(tǒng)[10]來管理和調(diào)度各個任務,以此來提高系統(tǒng)的實時性和整體穩(wěn)定性。
參考文獻(References):
[1] 張達,郭銀博,趙廣宇,胥勛偉.基于WK2168的氣象采集站多串口采集方案的設計與實現(xiàn)[J].電腦知識與技術(shù),2018.14(19):284-286
[2] 周敏.多串口卡在民航通信系統(tǒng)的綜合應用[J].科技與創(chuàng)新,2014.20:143-143
[3] 羅尹奇,劉力銀.基于JNI的Java串口通信系統(tǒng)的設計與實現(xiàn)—以Windows平臺為例[J].電腦知識與技術(shù),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++網(wǎng)絡庫[M].電子工業(yè)出版社,2013.
[6] 游雙.Linux高性能服務器編程[M].機械工業(yè)出版社,2013.
[7] 喬靜,劉寶旨,屈志強等.Linux中命名管道通信淺析[J].中國科技信息,2009.20:97-98
[8] 常曉明,王建東.CRC校驗及其軟件實現(xiàn)[J].電子技術(shù)應用,1995.6:14-14
[9] 湯子瀛,哲鳳屏,湯小丹.計算機操作系統(tǒng)[M].西安電子科技大學出版社,2001.
[10] 沙德鵬,彭剛.基于uC/OS的一種嵌入式系統(tǒng)的構(gòu)建[J].自動化與儀表,2018.33(4):91-94