" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Android USB轉(zhuǎn)串口通信開發(fā)基本流程

 更新時(shí)間:2017年04月11日 08:18:27   作者:山水相逢-z  
本篇文章主要介紹了Android USB轉(zhuǎn)串口通信開發(fā)基本流程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

好久沒有寫文章了,年前公司新開了一個(gè)項(xiàng)目,是和usb轉(zhuǎn)串口通信相關(guān)的,需求是用安卓平板通過usb轉(zhuǎn)接后與好幾個(gè)外設(shè)進(jìn)行通信,一直忙到最近,才慢慢閑下來,趁著這個(gè)周末不忙,記錄下usb轉(zhuǎn)串口通信開發(fā)的基本流程。

我們開發(fā)使用的是usb主機(jī)模式,即:安卓平板作為主機(jī),usb外設(shè)作為從機(jī)進(jìn)行數(shù)據(jù)通信。整個(gè)開發(fā)流程可以總結(jié)為以下幾點(diǎn):

1.發(fā)現(xiàn)設(shè)備

UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
Map<String, UsbDevice> usbList = usbManager.getDeviceList();

通過UsbManager這個(gè)系統(tǒng)提供的類,我們可以枚舉出當(dāng)前連接的所有usb設(shè)備,我們主要需要的是UsbDevice對(duì)象,關(guān)于UsbDevice這個(gè)類,官方是這樣注釋的:

This class represents a USB device attached to the android device with the android device
acting as the USB host.

是的,這個(gè)類就代表了Android所連接的usb設(shè)備。

2.打開設(shè)備

接下來,我們需要打開剛剛搜索到的usb設(shè)備,我們可以將平板與usb外設(shè)之間的連接想象成一個(gè)通道,只有把通道的門打開后,兩邊才能進(jìn)行通信。

一般來說,在沒有定制的android設(shè)備上首次訪問usb設(shè)備的時(shí)候,默認(rèn)我們是沒有訪問權(quán)限的,因此我們首先要判斷對(duì)當(dāng)前要打開的usbDevice是否有訪問權(quán)限:

if (!usbManager.hasPermission(usbDevice)) {
    usbPermissionReceiver = new UsbPermissionReceiver();
    //申請(qǐng)權(quán)限
    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);
    }

這里我們聲明一個(gè)廣播UsbPermissionReceiver,當(dāng)接受到授權(quán)成功的廣播后做一些其他處理: 

 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)) {
             //授權(quán)成功,在這里進(jìn)行打開設(shè)備操作
            } else {
             //授權(quán)失敗
            }
          }
        }
      }
    }
  }

接下來,我們要找到具有數(shù)據(jù)傳輸功能的接口UsbInterface,從它里邊兒找到數(shù)據(jù)輸入和輸出端口UsbEndpoint,一般情況下,一個(gè)usbDevice有多個(gè)UsbInterface,我們需要的一般是第一個(gè),所以:

usbInterface=usbDevice.getInterface(0);

同樣的,一個(gè)usbInterface有多個(gè)UsbEndpoint,有控制端口和數(shù)據(jù)端口等,因此我們需要根據(jù)類型和數(shù)據(jù)流向來找到我們需要的數(shù)據(jù)輸入和輸出兩個(gè)端口:

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設(shè)備,我們需要和usb外設(shè)建立一個(gè)UsbDeviceConnection,它的注釋很簡介的說明了它的用途:

This class is used for sending and receiving data and control messages to a USB device.

它的獲取也很簡單,就一句代碼:

usbDeviceConnection = usbManager.openDevice(usbDevice);

到這里,理論上平板和usb外設(shè)之間的連接已經(jīng)建立了,也可以首發(fā)數(shù)據(jù)了,但是,我們大部分情況下還需要對(duì)usb串口進(jìn)行一些配置,比如波特率,停止位,數(shù)據(jù)控制等,不然兩邊配置不同,收到的數(shù)據(jù)會(huì)亂碼。具體怎么配置,就看你使用的串口芯片是什么了,目前流行的有pl2303,ch340等,由于篇幅問題,需要具體配置串口代碼的朋友請(qǐng)自行查閱。

3.數(shù)據(jù)傳輸

到這里,我們已經(jīng)可以與usb外設(shè)進(jìn)行數(shù)據(jù)傳輸了,首先來看怎么向usb設(shè)備發(fā)送數(shù)據(jù)。

 1.向usb外設(shè)發(fā)送數(shù)據(jù)

在第二步中,我們已經(jīng)獲取了數(shù)據(jù)的輸出端口usbEndpointIn,我們向外設(shè)發(fā)送數(shù)據(jù)就是通過這個(gè)端口來實(shí)現(xiàn)的。來看怎么用:

復(fù)制代碼 代碼如下:

int ret = usbDeviceConnection.bulkTransfer(usbEndpointOut, data, data.length, DEFAULT_TIMEOUT);

bulkTransfer這個(gè)函數(shù)用于在給定的端口進(jìn)行數(shù)據(jù)傳輸,第一個(gè)參數(shù)就是此次傳輸?shù)亩丝?,這里我們用的輸出端口,第二個(gè)參數(shù)是要發(fā)送的數(shù)據(jù),類型為字節(jié)數(shù)組,第三個(gè)參數(shù)代表要發(fā)送的數(shù)據(jù)長度,最后一個(gè)參數(shù)是超時(shí),返回值代表發(fā)送成功的字節(jié)數(shù),如果返回-1,那就是發(fā)送失敗了。

2.接受usb外設(shè)發(fā)送來的數(shù)據(jù)

同理,我們已經(jīng)找到了數(shù)據(jù)輸入端口usbEndpointIn,因?yàn)閿?shù)據(jù)的輸入是不定時(shí)的,因此我們可以另開一個(gè)線程,來專門接受數(shù)據(jù),接受數(shù)據(jù)的代碼如下:

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轉(zhuǎn)串口通信的基本流程,有些地方寫的不是很全面,比如接收usb外設(shè)數(shù)據(jù)的方法應(yīng)該還有別的,不足之處歡迎指正。也希望大家多多支持腳本之家。

相關(guān)文章

  • Android粒子線條效果實(shí)現(xiàn)過程與代碼

    Android粒子線條效果實(shí)現(xiàn)過程與代碼

    這篇文章主要介紹了Android粒子線條效果的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • Android編程之?dāng)?shù)據(jù)庫的創(chuàng)建方法詳解

    Android編程之?dāng)?shù)據(jù)庫的創(chuàng)建方法詳解

    這篇文章主要介紹了Android編程之?dāng)?shù)據(jù)庫的創(chuàng)建方法,結(jié)合實(shí)例形式分析了Android數(shù)據(jù)庫創(chuàng)建的步驟、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • Android開發(fā)之自定義星星評(píng)分控件RatingBar用法示例

    Android開發(fā)之自定義星星評(píng)分控件RatingBar用法示例

    這篇文章主要介紹了Android開發(fā)之自定義星星評(píng)分控件RatingBar用法,結(jié)合具體實(shí)例形式分析了Android自定義評(píng)分控件的具體實(shí)現(xiàn)步驟以及功能、布局相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Android入門教程之RecyclerView的具體使用詳解

    Android入門教程之RecyclerView的具體使用詳解

    RecyclerView是Android一個(gè)更強(qiáng)大的控件,其不僅可以實(shí)現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。其可以實(shí)現(xiàn)數(shù)據(jù)縱向滾動(dòng),也可以實(shí)現(xiàn)橫向滾動(dòng)(ListView做不到橫向滾動(dòng))。接下來講解RecyclerView的用法
    2021-10-10
  • 解決Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com

    解決Error:All flavors must now belong to a named flavor dimens

    這篇文章主要介紹了解決Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com,需要的朋友可以參考下
    2017-11-11
  • Android自定義柱狀圖表的方法實(shí)例

    Android自定義柱狀圖表的方法實(shí)例

    柱狀圖是我們?cè)谌粘i_發(fā)中經(jīng)常會(huì)用到的一種圖表,下面這篇文章主要給大家介紹了關(guān)于Android如何自定義柱狀圖表的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2018-05-05
  • 另外兩種Android沉浸式狀態(tài)欄實(shí)現(xiàn)思路

    另外兩種Android沉浸式狀態(tài)欄實(shí)現(xiàn)思路

    這篇文章主要為大家介紹了另外兩種Android沉浸式狀態(tài)欄實(shí)現(xiàn)思路,android5.0及以后版本都支持給狀態(tài)欄著色,而目前android主流版本還是4.4,想要深入了解的朋友可以參考一下
    2016-01-01
  • Android開發(fā)之串口編程原理和實(shí)現(xiàn)方式

    Android開發(fā)之串口編程原理和實(shí)現(xiàn)方式

    提到串口編程,就不得不提到JNI,不得不提到JavaAPI中的文件描述符類:FileDescriptor;下面我分別對(duì)JNI、FileDescriptor以及串口的一些知識(shí)點(diǎn)和實(shí)現(xiàn)的源碼進(jìn)行分析說明,感興趣的朋友可以了解下
    2013-01-01
  • Android Activity 入門簡介

    Android Activity 入門簡介

    Activity 是一個(gè)應(yīng)用組件,用戶可與其提供的屏幕進(jìn)行交互,以執(zhí)行撥打電話、拍攝照片、發(fā)送電子郵件或查看地圖等操作,這篇文章主要介紹了Android Activity入門基礎(chǔ)知識(shí),需要的朋友可以參考下
    2024-04-04
  • Android中AOP的應(yīng)用實(shí)踐之過濾重復(fù)點(diǎn)擊

    Android中AOP的應(yīng)用實(shí)踐之過濾重復(fù)點(diǎn)擊

    這篇文章主要給大家介紹了關(guān)于Android中AOP的應(yīng)用實(shí)踐之過濾重復(fù)點(diǎn)擊的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09

最新評(píng)論

黄骅市| 钟山县| 商都县| 枣阳市| 临漳县| 洛南县| 六盘水市| 威海市| 翁牛特旗| 临漳县| 沅江市| 金塔县| 新兴县| 凌源市| 乐安县| 华宁县| 香格里拉县| 林西县| 黎川县| 宁陵县| 中卫市| 濉溪县| 庆阳市| 巴里| 临湘市| 个旧市| 长寿区| 岢岚县| 修水县| 九江市| 龙胜| 洛川县| 辽中县| 虞城县| 开化县| 石棉县| 平谷区| 高州市| 黑水县| 陆良县| 嘉祥县|