Android項目實戰(四十五):Usb轉串口通訊(CH34xUARTDriver)

來源:互聯網
上載者:User

標籤:name   執行   studio   ret   return   usb host   適用於   lib   XA   

原文:Android項目實戰(四十五):Usb轉串口通訊(CH34xUARTDriver)

需求為:手機usb介面插入一個硬體,從硬體上擷取資料

 例如:手機usb插入硬體A,A通過藍芽通訊擷取裝置a、b的資料,作為中轉站(可以做些資料處理)將資料(裝置a、b產生的)傳給手機程式。

             裝置A也可以自身就是一個感應器,自身就會產生資料傳送給手機程式。

 適用於:程式需要某些感應器的資料,但是手機自身不支援(或無法擷取)。

    手機自身藍芽串連有問題(廠商藍芽底層的修改導致的不穩定, 不能串連多個)

 缺點:部分手機不支援OTG,即無法擷取usb介面串連硬體的資料

 

---------------------------------------------------------分割線--------------------------------------------------------------

 

本文章以CH34X晶片為例。

官方:http://www.wch.cn/download/CH341SER_ANDROID_ZIP.html

 

  官方demo是eclipse項目,需要先自行建立一個android studio的demo

   一、建立一個android studio項目

   二、將 CH34xUARTDriver.jar 檔案放在目錄 : app --> libs 檔案下

      

     右鍵jar包

  

  三、在res檔案下建立xml檔案夾,講官方demo裡面的device_filter.xml 複製進去

  

 

      並在AndroidManifest.xml檔案裡添加代碼:

        在某一個Activity裡聲明,該作用為 當使用者插入裝置的時候,會提示是否開啟該程式,並調到指定的Activity (這一步不是必須操作,如果不想裝置插入就彈出提示是否開啟某個程式的話,就不用做這一步)

            <intent-filter>                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />            </intent-filter>              <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /> 

 

   

   四、一些jar包提供的方法

   //開啟裝置    public void OpenDevice(android.hardware.usb.UsbDevice usbDevice) { /* compiled code */ }    //關閉裝置     public void CloseDevice() { /* compiled code */ }        //判斷系統是否支援USB HOST    public boolean UsbFeatureSupported() { /* compiled code */ }       public int ResumeUsbList() { /* compiled code */ }    public int ResumeUsbPermission() { /* compiled code */ }    // 判斷裝置是否串連中(插入usb介面)    public boolean isConnected() { /* compiled code */ }       protected android.hardware.usb.UsbDevice getUsbDevice() { /* compiled code */ }    //對串口裝置進行初始化操作    public boolean UartInit() { /* compiled code */ }        //配置串口傳輸速率,函數說明可參照編程手冊    public boolean SetConfig(int i, byte b, byte b1, byte b2, byte b3) { /* compiled code */ }        // 讀串口資料    public int ReadData(byte[] bytes, int i) { /* compiled code */ }        // 寫串口資料    public int WriteData(byte[] bytes, int i) { /* compiled code */ }    // 寫串口資料    public int WriteData(byte[] bytes, int i, int i1) { /* compiled code */ }

 

 

 五、一些實踐中遇到的坑(重點)

    1、硬體工程師對usb串口硬體資料發送處理的時候,這個資料的長度是不能隨便指定的

            親測資料長度為32是正確的,程式read()方法接受正常,也就是說16 、32、64 。。。。,如果長度為28 、34這種,則程式read()方法讀出來的資料是不正常的。

 

      2、write()寫方法的參數是byte[]數組,也就是說如果介面上輸入的是字串,就需要將字串轉換為byte[]數組。

    官方demo中的方法是不正確的,正確提供如下

/**     * 將String轉化為byte[]數組     * @param arg     *            需要轉換的String對象     * @return 轉換後的byte[]數組     */    private byte[] toByteArray2(String arg) {        if (arg != null) {            /* 1.先去除String中的‘ ‘,然後將String轉換為char數組 */            char[] NewArray = new char[1000];            char[] array = arg.toCharArray();            int length = 0;            for (int i = 0; i < array.length; i++) {                if (array[i] != ‘ ‘) {                    NewArray[length] = array[i];                    length++;                }            }            NewArray[length] = 0x0D;            NewArray[length + 1] = 0x0A;            length += 2;            byte[] byteArray = new byte[length];            for (int i = 0; i < length; i++) {                byteArray[i] = (byte)NewArray[i];            }            return byteArray;        }        return new byte[] {};    }
將String轉化為byte[]數組

           

           同樣,提供如下幾個項目實踐中可能會使用到的方法:

 public byte[] subBytes(byte[] src, int begin, int count) {        byte[] bs = new byte[count];        System.arraycopy(src, begin, bs, 0, count);        return bs;    }
截取byte[]數組中的某一部分

 

    /**     * 將byte[]數組轉化為String類型     * @param arg     *            需要轉換的byte[]數組     * @param length     *            需要轉換的數組長度     * @return 轉換後的String隊形     */    private String toHexString(byte[] arg, int length) {        String result = new String();        if (arg != null) {            for (int i = 0; i < length; i++) {                if (i==length-1){                    result = result                            + (Integer.toHexString(                            arg[i] < 0 ? arg[i] + 256 : arg[i]).length() == 1 ? "0"                            + Integer.toHexString(arg[i] < 0 ? arg[i] + 256                            : arg[i])                            : Integer.toHexString(arg[i] < 0 ? arg[i] + 256                            : arg[i])) + "";                }else {                    result = result                            + (Integer.toHexString(                            arg[i] < 0 ? arg[i] + 256 : arg[i]).length() == 1 ? "0"                            + Integer.toHexString(arg[i] < 0 ? arg[i] + 256                            : arg[i])                            : Integer.toHexString(arg[i] < 0 ? arg[i] + 256                            : arg[i])) + " ";                }            }            return result;        }        return "";    }
將byte[]數組轉化為String類型

 

       3、關於usb串口插拔操作的監聽,寫死在jar包中了,如需定製,需要自己修改jar包原始碼

       

       4、關於第三步中的操作不是必須的,可根據需求決定是否添加

 

       5、並不是所有的手機都支援usb串口通訊(不支援OTG功能)

 

       6、流程為開啟裝置-->配置裝置,, 如果修改了配置參數,則可以直接配置裝置,不需要執行close -- > open > config

 

 六、Android studio Demo 連結

 

---------------------------------------------------------分割線--------------------------------------------------------------

 

藍芽通訊、usb串口通訊、unity與Android通訊 等問題,歡迎加入右側QQ群諮詢。

 

Android項目實戰(四十五):Usb轉串口通訊(CH34xUARTDriver)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.