4.与设备之间的通信

和USB设备通信可以是同步的或者是异步的,无论是哪一种情况,你都应该创建一个新的线程来处理数据传输,这样才不会使UI线程出现阻塞。与设备建立适宜的通信,你需要获得该设备一个合适的UsbInterfaceUsbEndpoint(想要通信)并且用 UsbDeviceConnection在终结点上发送请求。(原文:you
need to obtain the appropriateUsbInterface and UsbEndpoint of
the device that you want to communicate on and send requests on this endpoint with a UsbDeviceConnection.)总之,你写的代码应该这样:

4.1检查设备对象的属性,比如PID,VID或者设备单元来确定你是否想要与该设备进行通信

4.2当你确定该设备就是你想通信的对象,找到合适的UsbInterface(你想要用该接口在合适的UsbEndpoint下进行通信),接口可以有一个或者多个终结点,并且一般含有一个输入、输出端点来进行双向通信。

4.3当发现合适的endpoint时,在该endpoint处打开一个UsbDeviceConnection

4.4在终结点处,用的 bulkTransfer() 或controlTransfer() 方法提供你想要传送的数据。你应该在另外一个线程中去实行这一步骤以防UI线程被阻塞。

下面的代码段是一个琐碎的方式去做同步数据传输,你的代码应该有更多的逻辑性以便正确地找到正确的接口和终结点进行通信同时也不要再UI线程中做任何的数据传输

private Byte[] bytes
private static int TIMEOUT = 0;
private boolean forceClaim = true; ... UsbInterface intf = device.getInterface(0);
UsbEndpoint endpoint = intf.getEndpoint(0);
UsbDeviceConnection connection = mUsbManager.openDevice(device);
connection.claimInterface(intf, forceClaim);
connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //写在另一个线程中

异步发送数据,需要使用 UsbRequest类去初始化和队列异步请求,然后用requestWait()等待结果

5.终止设备通信

当通信完成或者设备拔出,通过请求releaseInterface() 和 close()来关闭 UsbInterfaceUsbDeviceConnection监听设备拔出事件,需要创建一个如下的广播接收器:

BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (device != null) {
// call your method that cleans up and closes communication with the device
}
}
}
};

在程序中而不是在Manifest中创建一个广播接收器可以让你的程序在运行时处理拔出事件。这样拔出事件仅仅被发送到当前运行的程序而不是广播到所有的应用程序中

usb-host与外设通信(三)的更多相关文章

  1. 【转】Android Service创建USB HOST通信

    之前做了一个关于Android USB通信的Case,通过Android的USB总线给Zigbee供电,和板载的Zigbee(基于Zigbee的自组网)进行通信.要使用Android的USB Host ...

  2. 【转】Android实战技巧之四十九:Usb通信之USB Host

    零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头 ...

  3. Android Service创建USB HOST通信

    之前做了一个关于Android USB通信的Case,通过Android的USB总线给Zigbee供电,和板载的Zigbee(基于Zigbee的自组网)进行通信.要使用Android的USB Host ...

  4. Android USB Host 与 Hid 设备通信bulkTransfer()返回-1问题的原因

    近期一直在做Android USB Host 与USB Hid设备(STM32FXXX)的通信,遇到了很多问题.项目源码以及所遇到的其他问题可以见本博客其他相关文章,这里重点讲一下bulkTransf ...

  5. Android USB Host 通信程序

    换到了一家新公司,于是就有了新的项目.这次的项目 要用Android SDK与USB HID设备进行通信.第一次接触Android SDK,以及USB,记录下源程序.开发过程以及一些心得. 首先,要感 ...

  6. android usb Host模式下与usb Hid 设备的通信

    做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法: 1,第一次遇到的问题:android 版本低不支持usb hid, 被要求做相关项目的时候,就从mUsbMana ...

  7. USB HOST与 USB OTG的区别及工作原理

    在SmartQ 7上面,同时存在USB HOST与 USB OTG两个接口,我想问一下,这两个接口有什么区别么?我怎么认为HOST属于是多余呢? 麻烦高手解答,感激不尽!!! 转自USB HOST与 ...

  8. Android USB Host与HID通讯 (二)

    不好意思,从上一篇到现在确实比较忙,中间又外出了一段时间,虽然也上LOFTER,或者看到一些朋友QQ上加我,给我发信息询问,有些看到了有些可能没看到,偶尔回复了一两个,也不咋的详细,在此我想说,一方面 ...

  9. Android开启OTG功能/USB Host API功能

    Android USB 模式简介 设备模式 当计算机或其他USB主机需要连接安卓设备时,此时安卓设备是作为"USB设备"角色的,在计算机上显示为 USB 外设.现在的安卓设备已经被 ...

随机推荐

  1. 文件转byte[ ]

    /** * 将文件转换成byte数组 * @param tradeFile * @return */public byte[] fileToByte(String fileUrl){ // 第1步.使 ...

  2. 软件开发程序猿日常必备,现用现查&日志记录

    日志记录-- logging模块 日志用处: 1.记录用户信息 2.记录个人流水 3.记录软件的运行状态 4.记录程序员发出的指令(跳板机) 5.用于程序员代码调试(print特别消耗内存,在开发测试 ...

  3. Codeforces 488C Fight the Monster

    Fight the Monster time limit per test             1 second                                   memory ...

  4. 四、hibernate的缓存

    缓存: 就是将数据保存到内存中,需要使用时直接从内存中获取,不需要每次查询数据库或者磁盘中的文件 hibernate的缓存 一级缓存:Session级别的缓存 二级缓存:SessionFactory级 ...

  5. LeetCode Array Easy169. Majority Element

    Description Given an array of size n, find the majority element. The majority element is the element ...

  6. LeetCode Array Easy 119. Pascal's Triangle II

    Description Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's tria ...

  7. Spring事务管理-传播行为-隔离级别

    事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败. 事务的特性:ACID 原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生 一致性:事务前后数据的完整性约束保持一致 ...

  8. poj 3744 矩阵快速幂+概率dp

    题目大意: 输入n,代表一位童子兵要穿过一条路,路上有些地方放着n个地雷(1<=n<=10).再输入p,代表这位童子兵非常好玩,走路一蹦一跳的.每次他在 i 位置有 p 的概率走一步到 i ...

  9. pc端与移动端适配解决方案之rem

    使用方式: 在html页面开头,引入下面的原生js代码 (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'ori ...

  10. mobx中使用class语法或decorator修饰器时报错

    之前课程中老师用的babel的版本比较低,我在学习时安装的babel版本较高,因此每当使用class语法或decorator修饰器时都会出现一些报错的情况! ❌ ERROR in ./src/inde ...