日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓开发中的USB转串口通讯

發布時間:2023/12/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓开发中的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方法獲取其端口
  貼上代碼:

UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); final List<UsbSerialDriver> drivers =UsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager);final List<UsbSerialPort> result = new ArrayList<UsbSerialPort>(); for (final UsbSerialDriver driver : drivers) {final List<UsbSerialPort> ports = driver.getPorts();Log.d(TAG, String.format("+ %s: %s port%s",driver, Integer.valueOf(ports.size()), ports.size() == 1 ? "" : "s"));result.addAll(ports); }

1
2
3
4
5
6
7
8
9
10
11
2.與串口設備通訊
  首先初始化USBSerialPort并且為其設置必要的參數,使用該UsbSerialPort實例來構建一個SerialInputOutputManager對象(manager),并以此對象構建線程并執行.調用manager的writeAsync()方法來寫數據,重寫onNewData方法來處理讀入的數據.
  
-為sPort設置必要的參數并開啟端口:

UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); UsbDeviceConnection connection = usbManager.openDevice(sPort.getDriver().getDevice());//初始化一個connection以實現USB通訊,詳見Android USB Host API try {//開啟端口sPort.open(connection);//為sPort設置參數sPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); } catch (IOException e) {Log.e(TAG, "Error setting up device: " + e.getMessage(), e);try {sPort.close();} catch (IOException e2) {// Ignore.}sPort = null;return; }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-構建SerialInputOutputManager對象并創建執行線程

//Git的源碼中使用了ExecutorService來異步執行線程 private final ExecutorService mExecutor = Executors.newSingleThreadExecutor(); //構建Manager對象并為其設置監聽器 private SerialInputOutputManager mSerialIoManager = new SerialInputOutputManager(sPort, mListener); private final SerialInputOutputManager.Listener mListener =new SerialInputOutputManager.Listener() {@Overridepublic void onRunError(Exception e) {Log.d(TAG, "Runner stopped.");}@Overridepublic void onNewData(final byte[] data) {SerialConsoleActivity.this.runOnUiThread(new Runnable() {@Overridepublic void run() {SerialConsoleActivity.this.updateReceivedData(data);}});} };

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转串口通讯的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。