張佳進,陳立暢,楊曉東,唐君君
(1.云南農(nóng)業(yè)大學(xué) 基礎(chǔ)與信息工程學(xué)院,云南 昆明 650201;2.云南農(nóng)業(yè)大學(xué) 工程技術(shù)學(xué)院,云南 昆明 650201)
隨著移動互聯(lián)網(wǎng)的高速發(fā)展,越來越多的人開始使用智能手機,其中Android智能手機市場占有率高達60%以上。除了基本的通話功能以外,智能手機已經(jīng)成為物聯(lián)網(wǎng)時代中新型的終端節(jié)點。
現(xiàn)在Android手機主要集成了Wifi、藍牙通信接口,它們具有傳輸速率高、通用性好等優(yōu)點。但是在物聯(lián)網(wǎng)領(lǐng)域中,由于成本、功耗、硬件資源等因素的限制,許多傳感器、控制設(shè)備往往采用傳統(tǒng)的串行通信技術(shù),例如UART、I2C、SPI等串行模式。然而當(dāng)前Android手機往往缺乏這些硬件接口,因此導(dǎo)致Android手機和傳統(tǒng)串行設(shè)備之間的通信比較困難[1]。
串口調(diào)試助手是專門用于測試串口通信使用的工具。串口調(diào)試助手具備了方便、穩(wěn)定、交互性強的特點,給嵌入式系統(tǒng)開發(fā)人員帶來了極大的便利。但是由于上述原因,目前在Android手機領(lǐng)域還沒有面向嵌入式系統(tǒng)的串口調(diào)試工具。
為了描述的方便,可以把UART串行通信接口抽象成一個傳感器系統(tǒng)。目前很多Android智能手機廠商將傳感器的軟硬件開發(fā)工作視為手機研發(fā)過程中一個非常重要的組成部分。但有趣的是到目前為止,Google公司在Android系統(tǒng)的Java框架層僅僅只提供了對常見的八種類型傳感器的支持,沒有規(guī)定各個類型的傳感器需遵循的通信協(xié)議和設(shè)備參數(shù)。
而在Android智能手機的研發(fā)過程中,傳感器底層軟件的設(shè)計和開發(fā)工作的流程、傳感器驅(qū)動程序與上層應(yīng)用進行交互的接口方式均無統(tǒng)一的標(biāo)準(zhǔn)和解決方案,這就要求傳感器底層軟件設(shè)計開發(fā)人員根據(jù)項目所使用的傳感器的硬件特點,以及其對于 Android架構(gòu)和Linux內(nèi)核的熟悉程度,設(shè)計出一套最適合自己特定環(huán)境下傳感器底層驅(qū)動程序,這很大程度加大了智能手機傳感器的軟件開發(fā)難度[2-3]。
IOIO模塊是國際著名開源公司SparkFun出品的一款專門為Android系統(tǒng)設(shè)計的通用型I/O擴展及控制模塊。該硬件模塊通過USB接口與Android手機相連,高度集成了多路數(shù)字I/O端口、I2C,SPI及UART串行控制器等功能組件,只需通過簡單、直觀的Java API即可直接操作外部硬件I/O,不需要額外的嵌入式軟件編程和其它硬件設(shè)備,使用方便靈活,開發(fā)便捷。目前眾多國際著名品牌的Android手機和平板電腦都兼容支持IOIO模塊,例如谷歌、三星、索尼等[4-5]。
鑒于以上因素,文中采用國際開源的IOIO模塊實現(xiàn)android手機的UART串行通信硬件接口,它能直接支持TTL串行通信,同時基于IOIO提供的IOIOLib庫,使用Java語言,在Android手機上開發(fā)串口通信調(diào)試助手軟件。
IOIO硬件模塊主要采用了低功耗的PIC24FJ256DA206單片機作為系統(tǒng)控制器,電路板上集成了多路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,能滿足復(fù)雜的串口通信系統(tǒng)應(yīng)用。
基于android手機和IOIO硬件接口,串口調(diào)試助手采用Java語言進行開發(fā),其開發(fā)環(huán)境配置及所需組件如表2所示[6-7]。
表2 串口調(diào)試助手開發(fā)環(huán)境要求Tab.2 Development environment required for Serial UART debugging assistant
與PC端的傳統(tǒng)串口調(diào)試助手類似,Android手機環(huán)境下的串口調(diào)試助手軟件功能主要包括接收和發(fā)送兩個模塊,詳見圖2。其中接收模塊支持以十六進制或ASCII字符格式接收數(shù)據(jù)。發(fā)送模塊具備手動發(fā)送和自動定時發(fā)送功能,同樣也支持十六進制或ASCII字符格式數(shù)據(jù)的發(fā)送。如圖3所示,在軟件接收區(qū)旁有“hex-re”和“hex-se”復(fù)選框,前者打鉤則表明以十六進制的方式接收,否則以ASCII字符方式接收數(shù)據(jù)。同理,“hex-se”則定義了以十六進制或ASCII字符方式發(fā)送數(shù)據(jù)。
圖2 系統(tǒng)的軟件設(shè)計結(jié)構(gòu)圖Fig.2 Schematic diagram of the software test system
圖3 系統(tǒng)軟件界面Fig.3 Interface chart of the test system
IOIO模塊在IOIOLib庫中提供了豐富的API接口,在本系統(tǒng)中主要采用了Uart接口函數(shù)。為了提高系統(tǒng)吞吐率,有效利用系統(tǒng)資源,改善用戶任務(wù)之間的通信效率,本軟件采用Java多線程技術(shù)。限于篇幅,本文只對其中的核心接口函數(shù)和類進行介紹。
1) 串口初始化 IOIO.openUart()
實 例 :Uart uart=ioio.openUart (rxPin, txPin, baud,parity, stopBits);
其中“rxPin”與“txPin”分別代表接收管腳和發(fā)送管腳所對應(yīng)的序號;“baud”代表的是波特率;“parity”為奇偶校驗位;“stopBits”是停止位數(shù)的定義。
例如 Uart uart=ioio.openUart(9, 14, 9 600, 0,1),該命令行表示打開一個串行口,9號管腳為接收端,發(fā)送端為14號管腳,9 600波特率,無校驗位,1位停止位。
2)數(shù)據(jù)接收與發(fā)送
IOIO提供了uart.getInputStream數(shù)據(jù)接收和uart.getOutputStream數(shù)據(jù)發(fā)送接口API函數(shù)。
另外采用了Java標(biāo)準(zhǔn)的InputStream類和OutputStream類。InputStream是所有輸入數(shù)據(jù)流的父類,它是一個抽象類,定義了所有輸入數(shù)據(jù)流都具有的共通特性,用于輸入單個字節(jié)或者字節(jié)數(shù)組。而OutputStream衍生的所有類都擁有基本方法write(),用于輸出單個字節(jié)或者字節(jié)數(shù)組。示例代碼如下:
InputStream in=uart.getInputStream();’讀入一個字節(jié)的數(shù)據(jù)
OutputStream out=uart.getOutputStream(); ‘發(fā)送一個字節(jié)數(shù)據(jù)
3)關(guān)閉串行口
當(dāng)完成串行口的發(fā)送或接收工作后,退出軟件前需要使用uart.close()函數(shù)對其進行正確關(guān)閉。
在測試實驗中,筆記本電腦端使用了串口調(diào)試助手軟件串口調(diào)試助手SComAssistant;三星N7100 Android手機作為測試用樣機,其微型USB接口通過數(shù)據(jù)線連接到IOIO模塊,而IOIO模塊通過USB轉(zhuǎn)TTL(UART)數(shù)據(jù)線和筆記本電腦進行串行通信,詳見圖4。
圖4 Android手機與筆記本電腦間的串行通信實驗系統(tǒng)Fig.4 Serial communication between android phone and laptop
測試實驗內(nèi)容重點是串行口的初始化設(shè)置、數(shù)據(jù)的接收和發(fā)送。
4.2.1 串行口的初始化設(shè)置
主要內(nèi)容包括發(fā)送和接收端管腳定義、波特率、校驗位和停止位的設(shè)置。
4.2.2 數(shù)據(jù)的接收和發(fā)送
從圖5中,手機端串口調(diào)試助手自動定時向筆記本電腦發(fā)送十六進制數(shù)“fd”,而電腦端向手機發(fā)送十六進制數(shù)“ac”,從實驗截圖上明顯可以看出,通過IOIO模塊上的UART串行口,筆記本電腦和Android手機間的串行通信穩(wěn)定可靠。
經(jīng)過多次反復(fù)的測試與實驗表明,以IOIO模塊為核心,基于Android手機串口調(diào)試助手軟件通信正常,尚未發(fā)現(xiàn)數(shù)據(jù)傳輸錯誤現(xiàn)象,完全能滿足嵌入式系統(tǒng)串口調(diào)試的實際需要。
本中討論了以IOIO模塊為核心,基于Android手機平臺,采用Java多線程技術(shù),實現(xiàn)了手機串口調(diào)試助手軟件。實驗表明該系統(tǒng)設(shè)計方案簡單易行,通信穩(wěn)定可靠,通用性好,具有一定的實際應(yīng)用價值。
圖5 串行口數(shù)據(jù)接收和發(fā)送實驗Fig.5 Experiment of RX and TX between serial UARTs
另外IOIO是一個開放的人機交互平臺,給Android手機提供了豐富的I/O接口資源,包含了UART、I2C、SPI等模式,能拓展Android手機的應(yīng)用領(lǐng)域,通過對其進行適當(dāng)?shù)臄U展與延伸,相信在android手機或平板電腦上可以提供更多的個性化創(chuàng)意體驗。
[1]張佳進,陳立暢,唐秀英,等.IOIO在Android手機中的應(yīng)用與研究[J].單片機與嵌入式系統(tǒng)應(yīng)用,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系統(tǒng)原理及開發(fā)要點詳解[M].北京:電子工業(yè)出版社,2010.
[7]陳宏希,鄒益民.用Matlabcontrol實現(xiàn)Java與Matlab的混合編程[J].工業(yè)儀表與自動化裝置,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.