張佳進,陳立暢,楊曉東,唐君君
(1.云南農業大學 基礎與信息工程學院,云南 昆明 650201;2.云南農業大學 工程技術學院,云南 昆明 650201)
隨著移動互聯網的高速發展,越來越多的人開始使用智能手機,其中Android智能手機市場占有率高達60%以上。除了基本的通話功能以外,智能手機已經成為物聯網時代中新型的終端節點。
現在Android手機主要集成了Wifi、藍牙通信接口,它們具有傳輸速率高、通用性好等優點。但是在物聯網領域中,由于成本、功耗、硬件資源等因素的限制,許多傳感器、控制設備往往采用傳統的串行通信技術,例如UART、I2C、SPI等串行模式。然而當前Android手機往往缺乏這些硬件接口,因此導致Android手機和傳統串行設備之間的通信比較困難[1]。
串口調試助手是專門用于測試串口通信使用的工具。串口調試助手具備了方便、穩定、交互性強的特點,給嵌入式系統開發人員帶來了極大的便利。但是由于上述原因,目前在Android手機領域還沒有面向嵌入式系統的串口調試工具。
為了描述的方便,可以把UART串行通信接口抽象成一個傳感器系統。目前很多Android智能手機廠商將傳感器的軟硬件開發工作視為手機研發過程中一個非常重要的組成部分。但有趣的是到目前為止,Google公司在Android系統的Java框架層僅僅只提供了對常見的八種類型傳感器的支持,沒有規定各個類型的傳感器需遵循的通信協議和設備參數。
而在Android智能手機的研發過程中,傳感器底層軟件的設計和開發工作的流程、傳感器驅動程序與上層應用進行交互的接口方式均無統一的標準和解決方案,這就要求傳感器底層軟件設計開發人員根據項目所使用的傳感器的硬件特點,以及其對于 Android架構和Linux內核的熟悉程度,設計出一套最適合自己特定環境下傳感器底層驅動程序,這很大程度加大了智能手機傳感器的軟件開發難度[2-3]。
IOIO模塊是國際著名開源公司SparkFun出品的一款專門為Android系統設計的通用型I/O擴展及控制模塊。該硬件模塊通過USB接口與Android手機相連,高度集成了多路數字I/O端口、I2C,SPI及UART串行控制器等功能組件,只需通過簡單、直觀的Java API即可直接操作外部硬件I/O,不需要額外的嵌入式軟件編程和其它硬件設備,使用方便靈活,開發便捷。目前眾多國際著名品牌的Android手機和平板電腦都兼容支持IOIO模塊,例如谷歌、三星、索尼等[4-5]。
鑒于以上因素,文中采用國際開源的IOIO模塊實現android手機的UART串行通信硬件接口,它能直接支持TTL串行通信,同時基于IOIO提供的IOIOLib庫,使用Java語言,在Android手機上開發串口通信調試助手軟件。
IOIO硬件模塊主要采用了低功耗的PIC24FJ256DA206單片機作為系統控制器,電路板上集成了多路UART、I2C、GPIO等多個功能接口部件。對于UART串行口的管腳定義見圖1所示。

圖1 IOIO模塊硬件實物圖Fig.1 Picture of IOIOhardware module

表1 IOIO串口UART管腳定義Tab.1 Pins of UART in IOIO
如上表1所示,一個IOIO模塊可以同時支持多達4個串口UART,能滿足復雜的串口通信系統應用。
基于android手機和IOIO硬件接口,串口調試助手采用Java語言進行開發,其開發環境配置及所需組件如表2所示[6-7]。

表2 串口調試助手開發環境要求Tab.2 Development environment required for Serial UART debugging assistant
與PC端的傳統串口調試助手類似,Android手機環境下的串口調試助手軟件功能主要包括接收和發送兩個模塊,詳見圖2。其中接收模塊支持以十六進制或ASCII字符格式接收數據。發送模塊具備手動發送和自動定時發送功能,同樣也支持十六進制或ASCII字符格式數據的發送。如圖3所示,在軟件接收區旁有“hex-re”和“hex-se”復選框,前者打鉤則表明以十六進制的方式接收,否則以ASCII字符方式接收數據。同理,“hex-se”則定義了以十六進制或ASCII字符方式發送數據。

圖2 系統的軟件設計結構圖Fig.2 Schematic diagram of the software test system

圖3 系統軟件界面Fig.3 Interface chart of the test system
IOIO模塊在IOIOLib庫中提供了豐富的API接口,在本系統中主要采用了Uart接口函數。為了提高系統吞吐率,有效利用系統資源,改善用戶任務之間的通信效率,本軟件采用Java多線程技術。限于篇幅,本文只對其中的核心接口函數和類進行介紹。
1) 串口初始化 IOIO.openUart()
實 例 :Uart uart=ioio.openUart (rxPin, txPin, baud,parity, stopBits);
其中“rxPin”與“txPin”分別代表接收管腳和發送管腳所對應的序號;“baud”代表的是波特率;“parity”為奇偶校驗位;“stopBits”是停止位數的定義。
例如 Uart uart=ioio.openUart(9, 14, 9 600, 0,1),該命令行表示打開一個串行口,9號管腳為接收端,發送端為14號管腳,9 600波特率,無校驗位,1位停止位。
2)數據接收與發送
IOIO提供了uart.getInputStream數據接收和uart.getOutputStream數據發送接口API函數。
另外采用了Java標準的InputStream類和OutputStream類。InputStream是所有輸入數據流的父類,它是一個抽象類,定義了所有輸入數據流都具有的共通特性,用于輸入單個字節或者字節數組。而OutputStream衍生的所有類都擁有基本方法write(),用于輸出單個字節或者字節數組。示例代碼如下:
InputStream in=uart.getInputStream();’讀入一個字節的數據
OutputStream out=uart.getOutputStream(); ‘發送一個字節數據
3)關閉串行口
當完成串行口的發送或接收工作后,退出軟件前需要使用uart.close()函數對其進行正確關閉。
在測試實驗中,筆記本電腦端使用了串口調試助手軟件串口調試助手SComAssistant;三星N7100 Android手機作為測試用樣機,其微型USB接口通過數據線連接到IOIO模塊,而IOIO模塊通過USB轉TTL(UART)數據線和筆記本電腦進行串行通信,詳見圖4。

圖4 Android手機與筆記本電腦間的串行通信實驗系統Fig.4 Serial communication between android phone and laptop
測試實驗內容重點是串行口的初始化設置、數據的接收和發送。
4.2.1 串行口的初始化設置
主要內容包括發送和接收端管腳定義、波特率、校驗位和停止位的設置。
4.2.2 數據的接收和發送
從圖5中,手機端串口調試助手自動定時向筆記本電腦發送十六進制數“fd”,而電腦端向手機發送十六進制數“ac”,從實驗截圖上明顯可以看出,通過IOIO模塊上的UART串行口,筆記本電腦和Android手機間的串行通信穩定可靠。
經過多次反復的測試與實驗表明,以IOIO模塊為核心,基于Android手機串口調試助手軟件通信正常,尚未發現數據傳輸錯誤現象,完全能滿足嵌入式系統串口調試的實際需要。
本中討論了以IOIO模塊為核心,基于Android手機平臺,采用Java多線程技術,實現了手機串口調試助手軟件。實驗表明該系統設計方案簡單易行,通信穩定可靠,通用性好,具有一定的實際應用價值。

圖5 串行口數據接收和發送實驗Fig.5 Experiment of RX and TX between serial UARTs
另外IOIO是一個開放的人機交互平臺,給Android手機提供了豐富的I/O接口資源,包含了UART、I2C、SPI等模式,能拓展Android手機的應用領域,通過對其進行適當的擴展與延伸,相信在android手機或平板電腦上可以提供更多的個性化創意體驗。
[1]張佳進,陳立暢,唐秀英,等.IOIO在Android手機中的應用與研究[J].單片機與嵌入式系統應用,2013,13(2):42-44.ZHANG Jia-jin,CHEN Li-chang,TANG Xiu-ying,et al.Research and application of IOIO in android phone[J].Microcontrollers&Embedded Systems,2013,13(2):42-44.
[2]SparkFun Electronics.IOIO for Android[EB/OL].[20-07-2013].https://www.sparkfun.com/products/10748.
[3]GitHub.Supported Devices[EB/OL].[20-07-2013].https://github.com/ytai/ioio/wiki/Supported-Devices.
[4]Chaudhri R,Brunette W,Goel M,et al.Open data kit sensors:mobile data collection with wired and wireless sensors [C]//In Proc.Of the 2nd ACM Symposium on Computing for Development, MIT,USA,March 2012:1-10.
[5]LIN Cheng-min,LANG Kuo-chen,CHU Yi-lun Chu,et al.An Implementation for Connecting Android Powered Device to External World [C]//The 2nd International Conference on Innovations in Bio-inspired Computing and Applications(BICA 2011), Shenzhen, Guangdong, China, December 2011:303-325.
[6]韓超,梁泉.Android系統原理及開發要點詳解[M].北京:電子工業出版社,2010.
[7]陳宏希,鄒益民.用Matlabcontrol實現Java與Matlab的混合編程[J].工業儀表與自動化裝置,2012(3):27-30.CHEN Hong-xi,ZOU Yi-min.Implementation of the hybrid programming with Java and matlab based on matlabcontrol[J].Industrial Instrumentation&Automation,2012(3):27-30.