1. 程式人生 > >Android 之 USB Host 串列埠程式設計

Android 之 USB Host 串列埠程式設計

1.OTG:

 A.手機作為Host,裝置作為Device,手機給裝置充電,需要通過OTG線實現(microUSB);(裝置可以為鍵盤/滑鼠/主機等等)

B.手機作為Host,另一手機作為Device,通過OTG可以通訊;

2.PC連線Android:(不需要OTG)

A.PC給iphone充電;

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

環境:android 平板4.1 ,OTG線,串列埠轉usb線,開發板

-------------------------------------------------

任務:使用平板傳送指令給開發板,開發板接受後,比如開始列印、

即使用android host 來連線外設。

基礎知識:

做usb通訊,首先要先弄清楚哪邊是HOST那邊是SLAVE。

比如你的android手機做host,要獲得slave,用UsbDevice表示slave

要是你的android手機做slave,要獲得host,用UsbAccessory表示host

以前沒有接觸過android USB Host程式設計。來到這個公司後,第一個任務就是寫一個android平板的usb host 的demo,和印表機,ic卡等通訊。

一、說一下USB HOST的用處:

       USB裝置分為HOST(主裝置)和SLAVE(從裝置),只有當一臺HOST與一臺SLAVE連線時才能實現資料的傳輸。android支援實現了android外設協議的USB硬體。Android外設和主機模式,在android3.1或者更高的平臺上直接支援。但是,對USB主機和外設模式的支援,最終還是要取決於裝置的硬體,而不僅僅是看平臺的等級。 我上網搜了一下,早期的一些夏新的手機,以及htc的WM手機支援USB HOST功能,而現在的android手機中支援USB HOST的還很非常少,查到的支援USB HOST功能的手機有三星的I9250,HTC手機暫未發現,現在測試使用的HTC T328w不支援USB HOST功能。所以,測試條件不太充分。        另外,USB HOST的主要用處,一般是android手機做HOST主裝置,用來控制其他一些元器件,比如,微控制器,滑鼠,遊戲手柄,數碼相機,等等。 說到手機的usb host 一般用OTG線連線usb外界裝置,但是OTG是什麼呢? 今天我才懂,慚愧啊, 這裡在簡單說明下:OTG即On-The-Go,是近年來發展起來的技術,主要應用是讓不同的USB裝置和移動裝置之間連線,進行資料交換。主要應用是在一些高階手機和平板上,在具有OTG功能的平板或手機上,我們可以連線各種USB裝置,例如滑鼠、鍵盤、U盤等,這對於移動辦公來說還是有一定作用的。尤其是對U盤、讀卡器等裝置的讀取,在身邊沒有電腦的情況就可利用移動裝置直接使用這些裝置。

連線無線鍵鼠,滑鼠移動尚算靈敏,但是部分輸入法使用鍵盤打字會出現嚴重的延遲,而且暫時還沒試出哪個輸入法支援USB鍵盤的中文輸入。 

連線U盤,這個算比較常見的一個用途,效果不錯。

       而很少把手機端當做從裝置,與電腦端通過USB HOST進行通訊的。另外看到一個人說不能通過USB HOST方式與電腦實現通訊: 二、通過socket方式進行連線      開始的時候看到一個例子說是通過USB HOST實現的PC與手機端進行連線,我根據查到的資料和自己的理解覺得大概是如下的意思:       1.基於socket程式設計方式,在android手機端和pc端進行連線傳輸資料。       2.連線時,需要通過adb forward方式進行埠轉發,才能連線的上去。       3.需要用到broadcast來進行,在server端用adb shell 命令開啟android端的socket連線服務。       4.主要基於android.hardware.usb包下的UsbManager 類和UsbAccessory類。       5.然後就是一些IO操作,IO處理及關閉優化。      最關鍵的兩點就是:      1)埠轉發:       Runtime.getRuntime().exec(“adb forward tcp :12580 tcp:10086 ”);       在服務端監聽10086埠。        2)在server端java程式中使用adb 命令啟動client端的service。          Runtime.getRuntime().exec(“adb shell am broadcast –a NotifyServiceStart”);        後來測試多次發現,這個方式沒有用到USB HOST的方式,依然是socket通訊,只不過是進行了一下埠轉發。        另外,關於socket通訊時,寫的android程式在模擬器上可以與PC上的server端進行通訊,而把程式裝到真機上時,就不能實現通訊,這個問題的主要原因是PC端和手機上的無線網路不在一個網段,無法進行連線。 三、串列埠通訊,hid訪問        在網上查到一些關於USB HOST的開發都是基於基於android端與一些微控制器進行串列埠通訊的,串列埠轉usb

USB HID

是Human Interface Device的縮寫,由其名稱可以瞭解HID裝置是直接與人互動的裝置,例如鍵盤、滑鼠與遊戲杆等。不過HID裝置並不一定要有人機介面,只要符合HID類別規範的裝置都是HID裝置。 mini usb 以前的手機的usb那樣 micro usb 現在手機的usb口那樣 總結: 串列埠通訊才是本次完成任務的重點, 既然android的SDK裡,在3.0以後,已經有支援usb外設, 所以我此次想法,先試試用java來,即SDK裡的API來和usb外設通訊。 其實SDK裡的API實現也是在jni來ndk程式設計,網上還有一些c/c++的api,不懂如何。 usb HID模式 ,串列埠轉usb兩種,開始我以為要分開這兩種情況。 其實,usb相關的裝置(無論是直接usb還是串列埠轉usb)都是可以和android host裝置通訊的。  最近在android平板上開發一個程式,可以通過mini Usb控制外部裝置,外部裝置介面是串列埠轉USB。平板和外部裝置之間通過OTG線連線,裝置由平板供電。
系統本意是想通過平板可以向裝置傳送串列埠指令。
在串列埠轉usb編寫程式,我可以連線到裝置,也可以傳送資料,不是-1了,但是 資料都是錯的,原因後來發現是,在設定波特率的時候,沒有效果,為什麼沒效果呢 因為串列埠轉usb線裡有一個晶片, 不同型號的晶片,設定波特率的方式不同,即 mDeviceConnection.controlTransfer(0x40, 0x03, baud, index, null, 0, 0); // set         // baudrate 上面的方法的引數值不同。 糾結了好久,參考了國外的大哥寫的,才調通了FT的晶片。