安卓开发中的USB转串口通讯
安卓開發中的USB轉串口通訊
本文使用GitHub上開源的”hoho.android.usbserial”USB串口庫。該庫基于“Android USB Host API”,驅動完全由java開發,無需root,不限內核,很是方便。
簡介Anddroid USB Host API
原文鏈接
android.hardware.usb包下提供了USB開發的相關類。
我們需要了解UsbManager、UsbDevice、UsbInterface、UsbEndpoint、UsbDeviceConnection、UsbRequest、UsbConstants。
1、UsbManager:獲得Usb的狀態,與連接的Usb設備通信。
2、UsbDevice:Usb設備的抽象,它包含一個或多個UsbInterface,而每個UsbInterface包含多個UsbEndpoint。Host與其通信,先打開UsbDeviceConnection,使用UsbRequest在一個端點(endpoint)發送和接收數據。
3、UsbInterface:定義了設備的功能集,一個UsbDevice包含多個UsbInterface,每個Interface都是獨立的。
4、UsbEndpoint:endpoint是interface的通信通道。
5、UsbDeviceConnection:host與device建立的連接,并在endpoint傳輸數據。
6、UsbRequest:usb 請求包。可以在UsbDeviceConnection上異步傳輸數據。注意是只在異步通信時才會用到它。
7、UsbConstants:usb常量的定義,對應linux/usb/ch9.h
安卓串口庫(hoho.android.usbserial)
該庫包含了CH34X系列等多款USB串口芯片的驅動,且提供UsbSerialDriver接口供用戶自定義驅動.
常用的類及接口:
1.UsbSerialDriver接口
該接口的實現類作為USB串口的驅動,需要重寫其中的getDevice方法和getPorts方法,其中getDevice()返回一個”原始設備”實例(詳見Android USB Host API),getPorts()返回所有可用的UsbSerialPort實例.
2.UsbSerialProber類
從類名可以看出,該類用于探測可用的USBSerial設備,可以使用它來獲取當前可用的USBSerial設備列表.
-方法getDefaultProber用于獲取默認的Prober實例
-方法findAllDrivers用于獲取所有的UsbSerialDriver列表
/**
* Finds and builds all possible {@link UsbSerialDriver UsbSerialDrivers}
* from the currently-attached {@link UsbDevice} hierarchy. This method does
* not require permission from the Android USB system, since it does not
* open any of the devices.
*
* @param usbManager
* @return a list, possibly empty, of all compatible drivers
*/
public List findAllDrivers(final UsbManager usbManager);
1
2
3
4
5
6
7
8
9
10
-方法probeDevice用于根據兼容UsbDevice獲取單個UsbSerialDevice實例
/**
* Probes a single device for a compatible driver.
*
* @param usbDevice the usb device to probe
* @return a new {@link UsbSerialDriver} compatible with this device, or
* {@code null} if none available.
*/
public UsbSerialDriver probeDevice(final UsbDevice usbDevice);
1
2
3
4
5
6
7
8
3.UsbSerialPort接口
該接口提供了所有的與USB串口設備通訊的方法,通過UsbSerialDriver.getPorts()可以獲取該UsbSerialDriver實例的所有端口實例.
4.SerialInputOutputManager類
這是一個實現了Runnable接口的類,從類名可以看出,該類提供了對串口設備I/O的管理.通過一個UsbSerialPort實例作為參數來構造一個管理器實例,使用時應該為該管理器綁定一個SerialInputOutputManager.Listener實例,該Listener使用回調的方式提供串口數據和串口異常數據
UsbSerialInputOutputManager.Listener提供了兩個抽象方法:onNewData(byte[] data)和OnRunError(Exception e).當有收到新數據時將會調用onNewData方法,數據data作為參數傳回;運行錯誤發生時調用onRunError方法,返回異常類實例e.
writeAsync()方法用來”線程安全”的向輸出流寫數據.
1.獲取支持的USB Devices列表。
首先初始化一個UsbManager的實例,然后用該UsbManger實例做參數,調用UsbSerialProber實例的findAllDrivers方法獲取所有的UsbSerialDrivers實例.因為最終需要UsbSrialPort進行通訊,所以在獲取所有的UsbSerialDrivers實例后應該調用它的getPorts方法獲取其端口
貼上代碼:
1
2
3
4
5
6
7
8
9
10
11
2.與串口設備通訊
首先初始化USBSerialPort并且為其設置必要的參數,使用該UsbSerialPort實例來構建一個SerialInputOutputManager對象(manager),并以此對象構建線程并執行.調用manager的writeAsync()方法來寫數據,重寫onNewData方法來處理讀入的數據.
-為sPort設置必要的參數并開啟端口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-構建SerialInputOutputManager對象并創建執行線程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
*在源碼中看到了一個很特別的Activity間傳參的方式,我將它記錄在我的另一篇博客中.
原文:https://blog.csdn.net/STchaoL/article/details/72716624
總結
以上是生活随笔為你收集整理的安卓开发中的USB转串口通讯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 264中 POC的计算方法
- 下一篇: 迫在眉睫的职业规划