Android开发中USB串口通信开发主要涉及到以下几个类及相应的方法:

1 ,UsbManager:负责管理USB设备的类,你可以在相应代码中通过以下方法获得

//获取UsbManager实例方法UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

该类提供的主要方法有:
1) getDeviceList()
获得设备列表,返回的是一个HashMap.;
2) hasPermission(UsbDevice device)
判断你的应用程序是否有接入此USB设备的权限,如果有则返回真,否则返回false.
3) openDevice(UsbDevice device)
打开USB设备,以便向此USB设备发送和接受数据,返回一个关于此USB设备的连接。
4) requestPermission(UsbDevice device, PendingIntent pi)
向USB设备请求临时的接入权限。
2UsbDevice:一个USB设备对象,每个设备一般包括一个接口,也可能有多个,每个接口又包含节点用来与此设备传输数据。主要方法有:

1) getDeviceClass()
返回此USB设备的类别,用一个整型来表示。
2) getDeviceId()
返回唯一标识此设备的ID号,也用一个整型来表示。
3) getDeviceName()
返回此设备的名称,用一个字符串来表示。
4) getDeviceProtocol()
返回此设备的协议类别,用一个整型来表示。
5) getDeviceSubclass()
返回此设备的子类别,用一个整型来表示。
6) getVendorId()
返回生产商ID
7) getProductId()
返回产品ID
8) getInterfaceCount()
返回此设备的接口数量
9) getInterface(int index)
得到此设备的一个接口,返回一个UsbInterface。
3,UsbInterface:代表USB设备的一个接口(物理接口),UsbInterface本身是一个类,此类的主要方法有以下:

1) getId()
得到给接口的id号。
2) getInterfaceClass()
得到该接口的类别。
3) getInterfaceSubclass()
得到该接口的子类。
4) getInterfaceProtocol()
得到该接口的协议类别。
5) getEndpointCount()
获得关于此接口的节点数量。
6) getEndpoint(int index)
对于指定的index获得此接口的一个节点,返回一个UsbEndpoint.
4, UsbEndpoint:代表一个接口的某个节点的类。该类主要方法:

1) getAddress()
获得此节点的地址
2) getAttributes()
获得此节点的属性
3) getDirection()
获得此节点的数据传输方向

5 ,UsbDeviceConnection:代表USB连接的一个类。用此连接可以想USB设备发送和接收数据,主要方法有:

1)bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)
通过给定的endpoint来进行大量的数据传输,传输的方向取决于该节点的方向,buffer是要发送或接收的字节数组,length是该字节数组的长度。传输成功则返回所传输的字节数组的长度,失败则返回负数。
2)controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
该方法通过0节点向此设备传输数据,传输的方向取决于请求的类别,如果requestType为USB_DIR_OUT则为写数据,USB_DIR_IN, 则为读数据
 

 首先单纯的USB通信,大致分为以下几个主要步骤:

一:添加相应权限:

 

AndroidManifest.xml中添加uses-feature过滤所有你设备不支持的应用:

 

uses-feature说明:https://blog.csdn.net/ccpat/article/details/51559168

二:查找连接手机的USB设备,使用到的是官方的UsbManager类。分为获取usbManager对象,查找设备就是用到这个对象的getDeviceList()方法,然后通过USB设备的PID和VID进一步筛选我们连接的设备(vid和pid可以通过打印device的信息获取),下面上图。

三:USB设备需要用户授权,才能正常使用,处理权限问题。同样使用到了usbManager对象。这里使用到了广播监听用户的授权情况,下面上图。

四:进行到了这里,我们找到了USB设备,并且处理了权限问题,剩下的就是打开USB设备的通信通道,进而可以读取数据。首先我们需要获取设备的UsbInterface,一个USb设备有多个UsbInterface,我们需要的是第一个。一个UsbInterface有多个端口,我们需要的是处理数据的端口,通过遍历可以获取到数据输入端口usbEndpointIn和输出端口usbEndpointOut。这两个端口就是我们进行数据读取的时候用到的。最后usbManager.openDevice(device)打开端口。到现在,我们进可以进行读写操作了。

五:读写操作,均使用usbManager.bulkTransfer()方法往USB通道里读写数据,有几个参数,下面以写数据为例,读数据和这差不多。参数1:输入输出端口。参数2:发送的字节数组。参数3:字节数组的长度。参数4:超时时间。返回值ret就是发送成功以后返回实际发送的字节数,可以当做发送成功与否的标志。接收的时候定义的字节数组应该比设备一次返回的字节数组大,查阅的资料是最少应该比设备返回的字节数大2个字节,比如设备返回的字节是480,那定义的数组长度应该是>480。接收数据开线程,循环接收,有数据随时处理。

至此,基本完成了主要的通信过程,可也可成功的读取设备数据,但是还需要优化一下,例如随时监听厂家USB设备的插入,自动打开项目。需要在清单文件中作配置。其中device_filter中内容是设备的VID和PID。然后在java中注册监听。

 

https://blog.csdn.net/u011555996/article/details/86221828

https://www.jianshu.com/p/47e4ad82dde2

https://blog.csdn.net/true100/article/details/51791929

https://www.xuebuyuan.com/702736.html

https://blog.csdn.net/srw11/article/details/39154053

 

 

更多相关文章

  1. Android存储设备(U盘,SD卡)状态监测
  2. Android(安卓)“adb forward”端口映射
  3. Android(安卓)listview 注意的地方
  4. Android学习札记20:ScaleGestureDetector
  5. 有空待研究的几篇不错的surfaceflinger文章
  6. Android(安卓)开发注意事项
  7. android中实现返回首页功能
  8. 为Android应用程序读取/dev下设备而提权
  9. android 蓝牙模块相关的一些知识了解

随机推荐

  1. 分析数万条旅游评论数据后,告诉你国庆“坑
  2. 让Python在后台自动解压各种压缩文件!
  3. 给女朋友写了一份前端学习路线。
  4. “你活该不去创业!”
  5. 小五碎碎谈
  6. 更高效的利用Jupyter+pandas进行数据分析
  7. 周末忙里偷闲去见了大学的俩老朋友。
  8. 如何在启动Jupyter Notebook时自动执行一
  9. 秒懂!图解四个实用的Pandas函数!
  10. YYDS: Webpack Plugin开发