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
- 建立一個xml文檔,名為android.hardware.usb.host.xml
<?xml version="1.0" encoding="utf-8"?> <permissions> <feature name ="android.hardware.usb.host"/> </permissions>
- 利用adb push 指令将其推送到 /etc/system/permissions/ 下
- 檢視push進去檔案的權限,将其改為777
- 建立一個xml文檔,名為android.hardware.usb.host.xml
-
在 /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.hardware.usb.host.xml
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);
- 在Application中初始化UsbDriverManager
附件:
android Usb序列槽通信封裝類