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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android OTG之USB转串口模块通讯

發布時間:2024/1/1 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android OTG之USB转串口模块通讯 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

飛哥語錄:要有自己做事的原則。

1.背景簡介

我們公司開發了一款室內機平板APP應用,要求平板能去控制智能門鎖、等其他智能設備,智能門鎖不是我們公司開發的,與我們公司屬于合作關系。

2.分析及實現思路

  • 智能門鎖的控制是通過使用 433射頻(不了解的請百度)來進行通訊的;
  • 平板是沒法與智能門鎖直接進行通訊,但是廠家提供了一個433通訊模塊(支持串口);
  • 而平板(支持OTG)是支持USB轉串口模塊的,所以整個流程是可以走通的,如下圖
  • 3.主要代碼實現

    3.1初始化USB轉串口模塊

    由于我們選用的是CH340模塊,我們先導入ch340的 jar 包,然后在代碼中檢查手機/平板是否支持USB HOST模式,如果支持我們就初始化通訊時的相關參數:波特率、數據位、停止位等,具體的參數看你們之間通訊的協議。初始化完成之后,我們就可以打開USB進行通訊了,同時初始化完成之后我們需要開啟一個讀取數據的線程,這樣,一旦收到數據或者相應的響應包(一般也叫ACK)我們就可以進行相應的處理了。

    下面貼上初始化、及開啟讀取數據線程的代碼實現:

    /*** initialize ch340 parameters.** @param context Application context.*/public static void initCH340(Context context) {if (context == null) return;Context appContext = context.getApplicationContext();mUsbManager = (UsbManager) appContext.getSystemService(Context.USB_SERVICE);if (mUsbManager != null) {HashMap<String, UsbDevice> deviceHashMap = mUsbManager.getDeviceList();for (UsbDevice device : deviceHashMap.values()) {if (device.getProductId() == 29987 && device.getVendorId() == 6790) {mUsbDevice = device;if (mUsbManager.hasPermission(device)) {loadDriver(appContext, mUsbManager);} else {if (listener != null) {listener.result(false);}}break;}}}}/*** load ch340 driver.** @param appContext* @param usbManager*/public static void loadDriver(Context appContext, UsbManager usbManager) {driver = new CH34xUARTDriver(usbManager, appContext, ACTION_USB_PERMISSION);// 判斷系統是否支持USB HOSTif (!driver.UsbFeatureSupported()) {InLog.e(TAG, "Your mobile phone does not support USB HOST, please change other phones to try again!");} else {openCH340();}}/*** config and open ch340.*/private static void openCH340() {int ret_val = driver.ResumeUsbList();InLog.d(TAG, ret_val + "");// ResumeUsbList方法用于枚舉CH34X設備以及打開相關設備if (ret_val == -1) {InLog.d(TAG, ret_val + "Failed to open device!");driver.CloseDevice();} else if (ret_val == 0) {if (!driver.UartInit()) { //對串口設備進行初始化操作InLog.d(TAG, ret_val + "Failed device initialization!");InLog.d(TAG, ret_val + "Failed to open device!");return;}InLog.d(TAG, ret_val + "Open device successfully!");if (!isOpenDeviceCH340) {isOpenDeviceCH340 = true;configParameters();//配置ch340的參數、需要先配置參數}} else {InLog.d(TAG, "The phone couldn't find the device!");}}/*** config ch340 parameters.* 配置串口波特率,函數說明可參照編程手冊*/private static void configParameters() {if (driver.SetConfig(baudRate, dataBit, stopBit, parity, flowControl)) {InLog.d(TAG, "Successful serial port Settings!");if (readDataRunnable == null) {readDataRunnable = new ReadDataRunnable();}mThreadPool.execute(readDataRunnable);} else {InLog.d(TAG, "Serial port Settings failed!");}}

    3.2發送和接收數據

    發送和接收數據都是按16進制進行發送和處理的,所以我們寫了一個工具類方便發送,如下:

    /*** Created by xpf on 2018/2/6 :)* Function:CH340數據處理工具類*/public class CH340Util {/*** write data in ch340.** @param byteArray 字節數組* @return 返回寫入的結果,-1表示寫入失敗!*/public static int writeData(@NonNull byte[] byteArray) {// 將此處收到的數組轉化為HexStringString hexString = bytesToHexString(byteArray, byteArray.length);InLog.i("TAG", "WriteHexString===" + hexString);return InitCH340.getDriver().WriteData(byteArray, byteArray.length);}/*** byte[]轉換為hexString** @param buffer 數據* @param size 字符數* @return 返回轉換后的十六進制字符串*/public static String bytesToHexString(byte[] buffer, final int size) {StringBuilder stringBuilder = new StringBuilder("");if (buffer == null || size <= 0) return null;for (int i = 0; i < size; i++) {String hex = Integer.toHexString(buffer[i] & 0xff);if (hex.length() < 2) stringBuilder.append(0);stringBuilder.append(hex);}return stringBuilder.toString();} }

    然后基本的發送和接收數據就寫完了,發送數據時調用 writeData() 方法就可以了,接收數據也類似,具體的業務及通訊的協議、加密規則等都需要你和硬件提供方進行協商對接制定,由于涉及到公司機密,此處我就不進行說明了,只說一下最基本的發送和接收數據。

    4.插入模塊實現自動打開APP

    Android中USB的插拔都會發送一個廣播,我們只需要在AndroidMenifest.xml文件中接收這個廣播就可以了,當我們入模塊的時候就會啟動我們的APP,第一次會彈出一個對話框詢問我們是否打開xxx應用,我們點擊確認即可,另外不是我們插入任何USB設備都打開我們的應用,所以我們需要過濾掉對我們沒有用的設備,在res下建一個xml目錄,新建usb_filter.xml文件,配置好我們這個USB設備模塊的product-id和vendor-id,每個模塊廠家這個值都是不一樣的,有兩種獲取方式,一個是代碼中枚舉USB設備然后打印出來,另外一種方法是打開Logcat觀察,然后插入USB設備,你會發現系統會打印出來這個USB設備等信息。

    最后不要忘了添加權限:

    <uses-featureandroid:name="android.hardware.usb.host"android:required="true" /><uses-permission android:name="android.hardware.usb.host" />

    此處由于篇幅原因就不具體展開講解更多細節了,核心的代碼和實現我都已經貼出來了,要想查看更具體的實現,請下載我的demo:

    https://github.com/xinpengfei520/USB-OTG-CH340-UART-interface

    若在閱讀過程中遇到什么問題,或有好提議,歡迎在下方評論。

    總結

    以上是生活随笔為你收集整理的Android OTG之USB转串口模块通讯的全部內容,希望文章能夠幫你解決所遇到的問題。

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