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