Android USB转串口通信开发基本流程
好久沒有寫文章了,年前公司新開了一個項目,是和usb轉串口通信相關的,需求是用安卓平板通過usb轉接后與好幾個外設進行通信。一直忙到近期,才慢慢閑下來,趁著這個周末不忙。記錄下usb轉串口通信開發的基本流程。
我們開發使用的是usb主機模式,即:安卓平板作為主機,usb外設作為從機進行數據通信。
整個開發流程能夠總結為下面幾點:
1.發現設備
UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); Map<String, UsbDevice> usbList = usbManager.getDeviceList();通過UsbManager這個系統提供的類。我們能夠枚舉出當前連接的全部usb設備,我們主要須要的是UsbDevice對象。關于UsbDevice這個類,官方是這樣凝視的:
This class represents a USB device attached to the android device with the android deviceacting as the USB host.是的,這個類就代表了android所連接的usb設備。
2.打開設備
接下來。我們須要打開剛剛搜索到的usb設備,我們能夠將平板與usb外設之間的連接想象成一個通道,僅僅有把通道的門打開后。兩邊才干進行通信。
一般來說。在沒有定制的android設備上首次訪問usb設備的時候,默認我們是沒有訪問權限的。因此我們首先要推斷對當前要打開的usbDevice是否有訪問權限:
if (!usbManager.hasPermission(usbDevice)) {usbPermissionReceiver = new UsbPermissionReceiver();//申請權限Intent intent = new Intent(ACTION_DEVICE_PERMISSION);PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context, 0, intent, 0);IntentFilter permissionFilter = new IntentFilter(ACTION_DEVICE_PERMISSION);context.registerReceiver(usbPermissionReceiver, permissionFilter);usbManager.requestPermission(usbDevice, mPermissionIntent);}這里我們聲明一個廣播UsbPermissionReceiver。當接受到授權成功的廣播后做一些其它處理:
private class UsbPermissionReceiver extends BroadcastReceiver {public void onReceive(Context context, Intent intent) {String action = intent.getAction();if (ACTION_DEVICE_PERMISSION.equals(action)) {synchronized (this) {UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);if (device.getDeviceName().equals(usbDevice.getDeviceName()) {if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {//授權成功,在這里進行打開設備操作} else {//授權失敗}}}}}}接下來,我們要找到具有傳輸數據功能的接口UsbInterface。從它里邊兒找到數據輸入和輸出portUsbEndpoint。普通情況下,一個usbDevice有多個UsbInterface。我們須要的通常是第一個,所以:
usbInterface=usbDevice.getInterface(0);相同的,一個usbInterface有多個UsbEndpoint,有控制port和數據port等。因此我們須要依據類型和數據流向來找到我們須要的數據輸入和輸出兩個port:
for (int index = 0; index < usbInterface.getEndpointCount(); index++) {UsbEndpoint point = usbInterface.getEndpoint(index);if (point.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {if (point.getDirection() == UsbConstants.USB_DIR_IN) {usbEndpointIn = point;} else if (point.getDirection() == UsbConstants.USB_DIR_OUT) {usbEndpointOut = point;}}}最后。才是真正的打開usb設備。我們須要和usb外設建立一個UsbDeviceConnection,它的凝視非常easy介紹的說明了它的用途:
This class is used for sending and receiving data and control messages to a USB device.它的獲取也非常easy。就一句代碼:
usbDeviceConnection = usbManager.openDevice(usbDevice);到這里,理論上平板和usb外設之間的連接已經建立了,也能夠首發數據了,可是,我們大部分情況下還須要對usb串口進行一些配置,比方波特率,停止位,數據控制等。不然兩邊配置不同,收到的數據會亂碼。詳細怎么配置。就看你使用的串口芯片是什么了,眼下流行的有pl2303,ch340等,因為篇幅問題。須要詳細配置串口代碼的朋友請自行查閱。
3.傳輸數據
到這里,我們已經能夠與usb外設進行傳輸數據了,首先來看怎么向usb設備發送數據。
1.向usb外設發送數據在第二步中,我們已經獲取了數據的輸出portusbEndpointIn。我們向外設發送數據就是通過這個port來實現的。來看怎么用:
int ret = usbDeviceConnection.bulkTransfer(usbEndpointOut, data, data.length, DEFAULT_TIMEOUT);bulkTransfer這個函數用于在給定的port進行傳輸數據,第一個參數就是此次傳輸的port,這里我們用的輸出port。第二個參數是要發送的數據,類型為字節數組,第三個參數代表要發送的數據長度,最后一個參數是超時。返回值代表發送成功的字節數,假設返回-1,那就是發送失敗了。
2.接受usb外設發送來的數據同理,我們已經找到了數據輸入portusbEndpointIn,由于數據的輸入是不定時的。因此我們能夠另開一個線程,來專門接受數據,接受數據的代碼例如以下:
int inMax = inEndpoint.getMaxPacketSize(); ByteBuffer byteBuffer = ByteBuffer.allocate(inMax); UsbRequest usbRequest = new UsbRequest(); usbRequest.initialize(connection, inEndpoint); usbRequest.queue(byteBuffer, inMax); if(connection.requestWait() == usbRequest){ byte[] retData = byteBuffer.array(); for(Byte byte1 : retData){ System.err.println(byte1); } }以上。就是usb轉串口通信的基本流程。有些地方寫的不是非常全面,比方接收usb外設數據的方法應該還有別的。不足之處歡迎指正。
轉載于:https://www.cnblogs.com/yutingliuyl/p/7287114.html
總結
以上是生活随笔為你收集整理的Android USB转串口通信开发基本流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《森林之子》(抢先体验版)现已上线 St
- 下一篇: Netflix在超30国下调订阅价格 涵