天天看點

android盒子的usb和序列槽之間的通信

android盒子的usb和序列槽之間的通信

前段時間接觸了一個android通過usb接口與序列槽之間的通信的項目,經過幾天的摸索,最後已成功

解決。 從網上查找的資料的,大都是序列槽之間的通信,幾乎很少有資料,是以本人當初也走了不少的彎路。

通過查找,本次使用了第三方jar[d2xx.jar],當然了,除了這個jar,還有一些其它的一些開源項目,[PhysicaloidLibrary]等等,這些我都測試過,也試過自己去寫jni,最終不了了之。

android系統識别Usb裝置

  • 問題

    自android3.1開始,android已經支援usb序列槽通信,但是在測試時,插入usb裝置,鍵盤滑鼠預設使用,但是usb 和序列槽連結無反應。通過資料查找,是因為好多廠商,并沒有給rom賦予usb權限。

  • 解決辦法
    • android.hardware.usb.host.xml
      1. 建立一個xml文檔,名為android.hardware.usb.host.xml
        <?xml version="1.0" encoding="utf-8"?>
        <permissions>
            <feature name ="android.hardware.usb.host"/>
        </permissions>
                   
      2. 利用adb push 指令将其推送到 /etc/system/permissions/ 下
      3. 檢視push進去檔案的權限,将其改為777
    • 在 /system/etc/permissions/

      查找 tablet_core_hardware.xml 或 handheld_core_hardware.xml

      先備份 cp … …

      然後在打開,在

      <permissions>

      中添加

      <feature name="android.hardware.usb.host"/>

    • reboot 重新開機後,就可以識别到Usb裝置了
    • 備注

      當出現如下錯誤時: system/etc/permissions/ is read-only filesystem

      解決辦法:

      adb remount

      adb shell

      chmod 777 system

android系統通過Usb轉序列槽與裝置通信的代碼實作

當時,本人通過android系統自帶的UsbManager相關的api去實作裝置的通信,雖然可以實作,但查找了許多資料并未解決設定通信參數的方法【波特率,校驗位,資料位。。】,最後經過好幾次折騰,選擇了 d2xx.jar 。

  • 相關的d2xx用法,請百度。下面就是經過本人封裝的一些類
    • UsbDriverManager

      這個類主要是擷取裝置資訊,打開序列槽,擷取連結,相關代碼請看附件

    • UsbSerialConnection

      這個類主要是處理通信過程中的讀寫操作

    • UsbSerialConnParamater

      通信參數封裝類

    • ReadListener

      接口類,主要作用于讀取資料時所調用的

  • 調用方法
    • 在Application中初始化UsbDriverManager
      private UsbDriverManager mDriverManager;
      
      mDriverManager = new UsbDriverManager(this); 
                 
    • 在相關代碼中
      //打開連結
      private void initSerialConnect() {
          if (serialConnection == null || !serialConnection.available()) {
              //根據端口,打開通信,擷取連結
              serialConnection = mApplication.getmDriverManager().open(portNum);
              //設定通信參數
              serialConnection.setConfig(new UsbSerialConnParameter(parameters.getBaudRate(), parameters.getDataBits(),
                      parameters.getStopBits(), parameters.getParity()), parameters.getDelayTimes());
              // 添加監聽read的監聽事件
              serialConnection.setLisener(new ReadLisener() {
      
                  @Override
                  public void onRead(byte[] rbuf, int size) {
                      parseReceivedData(serialConnection, rbuf); //讀取資料後的處理
                  }
      
                  @Override
                  public void onReadTimeOut() {
                      readTimeOut(); //逾時處理
                  }
              });
          }
      }
                 
    • 開啟讀寫操作
      //開啟讀的線程
      serialConnection.startReadThread();
      
      //寫資料
      serialConnection.write(entry, entry.length);
                 

附件:

android Usb序列槽通信封裝類