冉德綱 孫斌 楊建 申興發 周紅春



摘? 要: 目前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