針對(duì)手機(jī)與外部設(shè)備通信,僅有USB與音頻接口可以使用,而由于iOS手機(jī)不支持OTG功能。因此,本文主要對(duì)Android手機(jī)通過(guò)USB接口與外設(shè)通信進(jìn)行介紹。音頻接口部分可參考文檔http://blog.csdn.net/howiexue/article/details/79145048 。
0背景– 隨著移動(dòng)互聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展,兩大主流智能移動(dòng)設(shè)備iOS 和Android占據(jù)了絕對(duì)的市場(chǎng),除了基本的通話、娛樂(lè)功能之外,這些移動(dòng)設(shè)備已經(jīng)成為新時(shí)代中重要的信息終端設(shè)備節(jié)點(diǎn)。 – 通用串行總線(USB)目前已經(jīng)成為了最標(biāo)準(zhǔn)的接口,用于提供系統(tǒng)一個(gè)可靠且低成本的數(shù)字連接,目前在使用方面已經(jīng)超越了電腦的范疇,并已廣泛應(yīng)用在工業(yè)、醫(yī)療、消費(fèi)電子、通信網(wǎng)絡(luò)等等。 – RS232接口長(zhǎng)期廣泛存在于在各種應(yīng)用領(lǐng)域,隨著安卓手機(jī)平板的大量上市,安卓系統(tǒng)下通過(guò)USB轉(zhuǎn)RS232接口接入外設(shè)的應(yīng)用需求也開(kāi)始變得強(qiáng)烈起來(lái)。 市面上現(xiàn)有的手機(jī)USB接口與外設(shè)通信實(shí)例: 圖1 手機(jī)U盤(pán) 圖2 手機(jī)USB攝像頭
1.手機(jī)USB接口通信特點(diǎn)1.1 使用方便即插即用,可熱插拔,具有自動(dòng)配置能力,用戶只要簡(jiǎn)單地將外設(shè)插人到手機(jī)就能自動(dòng)識(shí)別和配置uSB設(shè)備。 1.2 通用性強(qiáng)目前安卓手機(jī)、平板都具備USB接口,連 接靈活,易擴(kuò)展。 1.3 速度快1.4 可采用總線供電USB2.0總線提供最大達(dá)5v電壓、500mA電流,USB3.0 可達(dá)1A。大部分USB外設(shè)無(wú)需單獨(dú)的供電系統(tǒng)。 由于 USB 的諸多特點(diǎn),在PC的外圍設(shè)備中,取代了大部分傳統(tǒng)的接口。但在智能儀器儀表中,還大量地使用RS一232C接口。隨著智能儀器儀表控制系統(tǒng)的日益復(fù)雜,數(shù)據(jù)采集量的增大,迫切需要尋求一種更高速、安全、方便的通信形式。USB接口的特點(diǎn),恰好滿足這種應(yīng)用要求,USB產(chǎn)品進(jìn)人智能儀器儀表和工業(yè)控制領(lǐng)域?qū)⑹潜厝坏摹?/p>
2. 手機(jī)USB接口通信原理USB通訊協(xié)議十分復(fù)雜,這里不贅述,只簡(jiǎn)要介紹基本知識(shí)。 2.1 常見(jiàn)手機(jī)USB接口圖3 常用USB接口圖 如上圖,包括常見(jiàn)的Standard Type-A、Type-B、Micro等接口 其中Micro USB接口是USB 2.0標(biāo)準(zhǔn)的一個(gè)便攜版本,支持OTG,目前除蘋(píng)果公司產(chǎn)品之外,先進(jìn)市面上幾乎所有的移動(dòng)設(shè)備都采用了Micro-USB接口。 圖4 Micro USB接口圖 圖5 各USB 版本傳輸速率與輸出電流對(duì)比 2.2 USB通信過(guò)程圖5 USB通信過(guò)程 一般的USB主機(jī)和設(shè)備之間遵循主從通信的原理,每一次的數(shù)據(jù)傳輸都是又主機(jī)發(fā)起。如果主機(jī)要輸出數(shù)據(jù),則先發(fā)一個(gè)握手包,通知設(shè)備。然后發(fā)送數(shù)據(jù),設(shè)備接收到數(shù)據(jù)后,再發(fā)送一個(gè)確認(rèn)包。如果主機(jī)要輸入數(shù)據(jù),也是先發(fā)一個(gè)握手包,通知設(shè)備。設(shè)備然后將準(zhǔn)備好的數(shù)據(jù)發(fā)送給主機(jī)。主機(jī)再給設(shè)備一個(gè)確認(rèn)包。 2.3 體系架構(gòu)從物理結(jié)構(gòu)上,USB系統(tǒng)是一個(gè)星形結(jié)構(gòu)。其包含三類(lèi)硬件設(shè)備: USB主機(jī)(USB HOST)、 USB設(shè)備(USB DEVICE)和USB集線器(USB HUB)。 USB總線上的物理連接是一個(gè)分層的星形拓?fù)洌幱诿總€(gè)星形拓?fù)渲醒氲氖荋UB集線器,在主機(jī)與HUB之間,HUB與HUB之間,HUB與設(shè)備之間都是點(diǎn)對(duì)點(diǎn)的連接。 圖6 USB整體架構(gòu) USB HOST對(duì)USB系統(tǒng)進(jìn)行管理、每毫秒產(chǎn)生一幀數(shù)據(jù)、發(fā)送配置請(qǐng)求對(duì)USB設(shè)備進(jìn)行配置、管理和恢復(fù)總線上的錯(cuò)誤。 USB HUB用于設(shè)備擴(kuò)展連接,所有USB DEVICE都連接在USB HUB的端口上。 USB DEVICE接收USB總線上的所有數(shù)據(jù)包,通過(guò)數(shù)據(jù)包的地址域來(lái)判斷是不是發(fā)給自己的數(shù)據(jù)包:若地址不符,則簡(jiǎn)單地丟棄該數(shù)據(jù)包;若地址相符,則通過(guò)響應(yīng)USB HOST的數(shù)據(jù)包與USB HOST進(jìn)行數(shù)據(jù)傳輸。
從邏輯結(jié)構(gòu)上看,每個(gè)USB邏輯設(shè)備都直接與USB HOST進(jìn)行數(shù)據(jù)傳輸。與傳統(tǒng)接口以硬件手段實(shí)現(xiàn)握手的方法不同,USB接口使用“軟握手”方法。 USB的軟握手機(jī)制是透過(guò)三個(gè)層次的驅(qū)動(dòng)程序?qū)崿F(xiàn)的,在這中間起到關(guān)鍵作用的是設(shè)備驅(qū)動(dòng)程序,該程序在主機(jī)與設(shè)備之間建立起至少一個(gè)管道。管道有兩種類(lèi)型:流管道和消息管道。其中有一個(gè)最重要的消息管道是“缺省控制管道”,這個(gè)管道在設(shè)備一加電的時(shí)候就存在了,它提供設(shè)備的配置和狀態(tài)等信息。主機(jī)與設(shè)備之間的聯(lián)絡(luò)就是通過(guò)消息管道實(shí)現(xiàn)的。 2.4軟件層次 圖7 USB軟件結(jié)構(gòu)
USB協(xié)議棧驅(qū)動(dòng)程序的主要作用是將設(shè)備與相應(yīng)的設(shè)備驅(qū)動(dòng)程序連接起來(lái)。因?yàn)閁SB支持的設(shè)備很多,而每個(gè)具體的設(shè)備都有自己對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序。對(duì)于某一具體設(shè)備來(lái)說(shuō),使用哪個(gè)驅(qū)動(dòng)來(lái)管理,就要由協(xié)議棧驅(qū)動(dòng)程序通過(guò)讀取設(shè)備描述符進(jìn)行挑選。選擇好驅(qū)動(dòng)程序之后,協(xié)議棧驅(qū)動(dòng)程序還要給USB設(shè)備分配地址。 管道建立起來(lái)之后,數(shù)據(jù)的傳輸控制則由USB接口驅(qū)動(dòng)程序負(fù)責(zé)完成了。在這里,主機(jī)占有絕對(duì)主導(dǎo)權(quán)。設(shè)備發(fā)生事件時(shí)通過(guò)消息管道報(bào)告給主機(jī),主機(jī)伺機(jī)向設(shè)備發(fā)送命令,開(kāi)通流管道,發(fā)送或接收數(shù)據(jù)包。主機(jī)與設(shè)備之間以數(shù)據(jù)數(shù)據(jù)包的形式進(jìn)行傳送,顯然這與網(wǎng)絡(luò)上數(shù)據(jù)傳輸?shù)姆绞较嗤?,是一種異步數(shù)據(jù)傳輸模式。
3. 手機(jī)USB接口與外設(shè)通信方案3.1 USB(手機(jī))<–>USB(外設(shè))該方案手機(jī)與外設(shè)均通過(guò)USB口進(jìn)行通訊。 圖8 USB-USB方案結(jié)構(gòu)圖 考慮外設(shè)主控模塊為單片機(jī),因此選用的單片機(jī)必須具備驅(qū)動(dòng)USB的能力。之間通訊都是走的標(biāo)準(zhǔn)USB通訊協(xié)議。 3.1.1 USB Host簡(jiǎn)述USB Host,中文意思是USB主模式,是相對(duì)于USB Accessory(USB副模式)來(lái)說(shuō)的。如果Android工作在USB Host模式下,則連接到Android上的USB設(shè)備把Android類(lèi)似的看作是一臺(tái)主機(jī),例如將鼠標(biāo)、鍵盤(pán)插入則可以使用鍵盤(pán)、鼠標(biāo)來(lái)操作Android系統(tǒng)。 而USB Accessory模式表示將Android設(shè)備類(lèi)似當(dāng)作一個(gè)USB的鍵盤(pán)、鼠標(biāo)、U盤(pán)插入到電腦主機(jī)上一樣使用,這兩種模式在Android API level-12以上才支持,即Android3.1及更高的版本支持這兩種模式。 3.2 USB(手機(jī))<–>UART(外設(shè))即手機(jī)與外設(shè)之間利用USB-UART轉(zhuǎn)接器,實(shí)現(xiàn)手機(jī)與外設(shè)的串口通信。 USB-UART轉(zhuǎn)換器是實(shí)現(xiàn)USB與RS-232/RS-485/RS-422等串口設(shè)備相互通訊的一種協(xié)議轉(zhuǎn)換裝置(USB協(xié)議-串行通信協(xié)議)。在通信主機(jī)(USB)和RS-232/RS-485/RS-422串口設(shè)備之間可以實(shí)現(xiàn)數(shù)據(jù)的雙向傳輸。 圖9 USB-UART方案結(jié)構(gòu)圖 該方案只需外設(shè)單片機(jī)進(jìn)行串口編程,然后利用安卓USB Host編程。串口編程一般單片機(jī)開(kāi)發(fā)都已熟悉,這里主要介紹一下USB Host開(kāi)發(fā)。 需要硬件要求:手機(jī)必須支持OTG功能。OTG(On The Go)是一種新型的USB,能夠在沒(méi)有電腦的情行下,實(shí)現(xiàn)設(shè)備間的數(shù)據(jù)及圖像的傳送,在手機(jī)中加入傳感器,同時(shí)將運(yùn)行程序載入開(kāi)發(fā)板中,通過(guò)OTG接口與手機(jī)相接,能夠讓手機(jī)擁有更強(qiáng)大的功能。
3.2.1 Android手機(jī)通過(guò)USB接口進(jìn)行串口通信Android手機(jī)通過(guò)USB接口實(shí)現(xiàn)串口通信,主要借助外部USB轉(zhuǎn)串口芯片實(shí)現(xiàn)。在這里外設(shè)是一個(gè)UART串口設(shè)備,轉(zhuǎn)換芯片已經(jīng)轉(zhuǎn)換成USB,幫助安卓上層應(yīng)用屏蔽了串口。但串口參數(shù)還是需要上層應(yīng)用配置。 其步驟一般包括:發(fā)現(xiàn)設(shè)備->連接設(shè)備->數(shù)據(jù)雙向傳輸->關(guān)閉設(shè)備。 其中調(diào)用原理是基于安卓軟件架構(gòu),Android SDK并沒(méi)有在Framework層實(shí)現(xiàn)封裝關(guān)于串口通信的類(lèi)庫(kù),但是Android是基于Linux kernel 2.6上的,所以我們可以像在Linux系統(tǒng)上一樣來(lái)使用串口。因?yàn)镕ramework層中并沒(méi)有封裝關(guān)于串口通信的類(lèi)庫(kù),所以我們需要通過(guò)Android NDK來(lái)實(shí)現(xiàn)打開(kāi)、讀寫(xiě)串口,然后提供接口供Java本地調(diào)用。 4.現(xiàn)有解決方案:4.1 FTDI方案(免驅(qū)動(dòng)) 圖10 FTDI整體方案
4.1.1串口設(shè)備 <–>FT312X主(Host)<–> 安卓從(Slave)Host 會(huì)向安卓供電,無(wú)需外接電源。這個(gè)方案是利用了谷歌(Google)開(kāi)放的一個(gè)叫Android Open Accessory Mode 的協(xié)議而成的,此方案支持安卓3.1以的手機(jī)平板,但如果不是原生谷歌的系統(tǒng)有可能是不支持的,一般出現(xiàn)問(wèn)題是國(guó)內(nèi)一些山寨品牌。 /com.android.future.usb.accessory.jar /android.hardware.usb.accessory.xml
如缺少以上其中之一都會(huì)導(dǎo)致安卓設(shè)備不支持安卓串口。 4.1.2串口設(shè)備 <–>FT231X從(Slave)<–> 安卓主(Host)隨著手持式設(shè)備的普及,平板電腦、手機(jī)和消費(fèi)電子設(shè)備需要搭配可以與USB相連的主端支持變得非常重要。該方案中,F(xiàn)T311D芯片是專為安卓主控端設(shè)計(jì),支持Android3.1以上版本,有32腳的QFN或LQFP封裝可選。 設(shè)備不需要在安卓平臺(tái)加載任何驅(qū)動(dòng),但要使用該方案Android手機(jī)要支持OTG 功能,并且要具備android.hardware.usb.host.xml
另外,相應(yīng)的方案需要配合相應(yīng)軟件, 如方案4.1.1需要配合Passion AOA HyperTerminal apk。 方案4.1.2需要配合Android HyperTerminal apk。這兩個(gè)安卓上的串口調(diào)試小助手, 是Passion technologies Limited 開(kāi)發(fā)的免費(fèi)軟件。 4.2 PL2303/CH34X系列方案:基本原理同F(xiàn)TDI相同,只不過(guò)芯片不同。 手機(jī)端app是PL2303/Ch34x的生產(chǎn)商公司提供的,有源代碼與SDK: http://www./US/ShowProduct.aspx?p_id=230&pcid=41 圖11 PL2303整體方案 PL2303 HXD芯片對(duì)Android系統(tǒng)要求Android(平板或手機(jī))的OS版本需要在3.2以上。其優(yōu)點(diǎn)如下: · 不需要Root權(quán)限即可使用 · 不需要重新編譯Kernel,免驅(qū)動(dòng)方案 · 利用Android上的USB port供電,或者使用USBHub 以及外設(shè)自備電源 ##4.3 開(kāi)源項(xiàng)目:usb-serial-for-android Github: https://github.com/mik3y/usb-serial-for-android (LGPL licence) 提供了Arduino等其他設(shè)備USB串口的安卓端硬件驅(qū)動(dòng)代碼,基于Android Host并且Android版本需在3.1版本之上 。 可供參考 ##4.4 其他(待補(bǔ)充,但原理都是基于3.1、3.2)
4.3 開(kāi)源項(xiàng)目:usb-serial-for-androidGithub: https://github.com/mik3y/usb-serial-for-android (LGPL licence) 提供了Arduino等其他設(shè)備USB串口的安卓端硬件驅(qū)動(dòng)代碼,基于Android Host并且Android版本需在3.1版本之上 。 可供參考
5.針對(duì)安卓應(yīng)用USB-UART芯片比較與選型1、FT311/312芯片不需要安卓手機(jī)和平板支持OTG或USB HOST功能,就能完成USB轉(zhuǎn)RS232的轉(zhuǎn)換功能,兼容性好,必須外接電源,使得在某些應(yīng)用場(chǎng)景非常不方便。但FT311/312依然是目前已知好用的USB HOST 芯片。 2、FT231,PL2303不需要外接電源,但需要安卓手機(jī)和平板支持OTG或USB HOST等限制。由于手機(jī)和平板上的安卓系統(tǒng)的多樣性,沒(méi)有確定的標(biāo)準(zhǔn)知道某款手機(jī)平板是否支持OTG和USB HOST,且即使手機(jī)平板支持OTG功能的情況下,非原生安卓系統(tǒng)仍可能不能完成usb轉(zhuǎn)RS232的功能。所有其兼容性要差一些。 3、在工業(yè)應(yīng)用環(huán)境,可考慮使用工業(yè)級(jí)模塊FSTU2232FT。 因此,針對(duì)民用設(shè)備,綜合考慮,較優(yōu)越的方案為:使用FT311D和PL2303HXD做轉(zhuǎn)換芯片,優(yōu)點(diǎn)如下:
· FT311D不需要OTG支持,兼容性好,需要外接電源,價(jià)格較貴。 · PL2303HXD需要OTG支持,不需要外接電源,有兼容性問(wèn)題,價(jià)格要便宜些。 · 用PL2303的模塊還有一附加好處是同時(shí)支持安卓和WINDOWS平臺(tái),即可用于手機(jī)平板,也同時(shí)可用于普通的臺(tái)式和筆記本電腦。
6.案例分析(待完善驗(yàn)證)1、USB轉(zhuǎn)串口驅(qū)動(dòng) drivers/usb/serial/pl2303.c drivers/usb/serial/pl2303.h 驅(qū)動(dòng)加載成功則當(dāng)插入外設(shè)時(shí)會(huì)生成/dev/ttyUSB*設(shè)備節(jié)點(diǎn), 2、上層App應(yīng)用,即讀寫(xiě)串口,波特率設(shè)置等 源碼下載http://www./US/ShowProduct.aspx?p_id=230&pcid=41 示意圖:
7. 開(kāi)發(fā)需要考慮的幾點(diǎn)1、OTG支持問(wèn)題:近年新出的絕大部分手機(jī)已支持OTG,一般Android系統(tǒng)版本在4.0以上也都會(huì)支持,但手機(jī)品牌、型號(hào)太多,一些低端手機(jī)和國(guó)產(chǎn)山寨機(jī)可能不支持該功能。 2、不同手機(jī)廠商可能對(duì)USB協(xié)議棧進(jìn)行了裁剪,對(duì)開(kāi)發(fā)人員會(huì)有限制。 3、USB供電問(wèn)題、設(shè)備兼容性等問(wèn)題 4、如使用USB-UART方案,要考慮轉(zhuǎn)換芯片的統(tǒng)一、效率等問(wèn)題,都需驗(yàn)證 5、目前在安卓系統(tǒng)下的串口終端程序,大多是由IC廠家免費(fèi)提供,功能偏簡(jiǎn)單,不能發(fā)送中文,不能保存通信內(nèi)容到文件。
8. 參考資料[1] 趙春亭, 左小五. 基于Android系統(tǒng)的USB轉(zhuǎn)串口的研究[J]. 工業(yè)控制計(jì)算機(jī), 2014, 27(1):83-84. 參考鏈接: http://blog.csdn.net/ever_gz/article/details/49669729 https://github.com/mik3y/usb-serial-for-android http://blog.csdn.net/lindonghai/article/details/50717218 http://download.csdn.net/detail/u011130391/6638743 http://gqdy365./blog/2188906 http://blog.csdn.net/tangcheng_ok/article/details/7021470 http://www.jb51.net/article/110827.htm http://www./US/ShowProduct.aspx?p_id=230&pcid=41
|