Android中将USB装换为串口通信的方法

  

Android中将USB装换为串口通信的方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强> 1。发现设备

 UsbManager UsbManager=(UsbManager) context.getSystemService (Context.USB_SERVICE);
  UsbDevice> Map<字符串;usbList=usbManager.getDeviceList (); 

通过UsbManager这个系统提供的类,我们可以枚举出当前连接的所有usb设备,我们主要需要的是UsbDevice对象,关于UsbDevice这个类,官方是这样注释的:

这类代表一个usb设备连接到android设备的android设备作为usb主机。

是的,这个类就代表了android所连接的usb设备。

<强> 2。打开设备

接下来,我们需要打开刚刚搜索到的usb设备,我们可以将平板与usb外设之间的连接想象成一个通道,只有把通道的门打开后,两边才能进行通信。

一般来说,在没有定制的android设备上首次访问usb设备的时候,默认我们是没有访问权限的,因此我们首先要判断对当前要打开的usbDevice是否有访问权限:

私有类UsbPermissionReceiver BroadcastReceiver{延伸
  公共空间> usbInterface=usbDevice.getInterface (0); 

同样的,一个usbInterface有多个UsbEndpoint,有控制端口和数据端口等,因此我们需要根据类型和数据流向来找到我们需要的数据输入和输出两个端口:

 (int指数=0;指数& lt;usbInterface.getEndpointCount ();指数+ +){
  UsbEndpoint点=usbInterface.getEndpoint(指数);
  如果(point.getType ()==UsbConstants.USB_ENDPOINT_XFER_BULK) {
  如果(point.getDirection ()==UsbConstants.USB_DIR_IN) {
  usbEndpointIn=点;
  }else if (point.getDirection ()==UsbConstants.USB_DIR_OUT) {
  usbEndpointOut=点;
  }
  }
  }

最后,才是真正的打开usb设备,我们需要和usb外设建立一个UsbDeviceConnection,它的注释很简介的说明了它的用途:

这类是用于发送和接收数据和控制信息到一个usb设备。

它的获取也很简单,就一句代码:

 usbDeviceConnection=usbManager.openDevice (usbDevice); 

到这里,理论上平板和usb外设之间的连接已经建立了,也可以首发数据了,但是,我们大部分情况下还需要对usb串口进行一些配置,比如波特率,停止位,数据控制等,不然两边配置不同,收到的数据会乱码。具体怎么配置,就看你使用的串口芯片是什么了,目前流行的有pl2303, ch440等,由于篇幅问题,需要具体配置串口代码的朋友请自行查阅。

<强> 3。数据传输

到这里,我们已经可以与usb外设进行数据传输了,首先来看怎么向usb设备发送数据。

, 1。向usb外设发送数据

在第二步中,我们已经获取了数据的输出端口usbEndpointIn,我们向外设发送数据就是通过这个端口来实现的。来看怎么用:

代码如下:
int ret=usbDeviceConnection。bulkTransfer (usbEndpointOut、数据数据。长度,DEFAULT_TIMEOUT);

bulkTransfer这个函数用于在给定的端口进行数据传输,第一个参数就是此次传输的端口,这里我们用的输出端口,第二个参数是要发送的数据,类型为字节数组,第三个参数代表要发送的数据长度,最后一个参数是超时,返回值代表发送成功的字节数,如果返回1,那就是发送失败了。

2。接受usb外设发送来的数据

同理,我们已经找到了数据输入端口usbEndpointIn,因为数据的输入是不定时的,因此我们可以另开一个线程,来专门接受数据,接受数据的代码如下:

 int inMax=inEndpoint.getMaxPacketSize ();
  ByteBuffer ByteBuffer=ByteBuffer.allocate (inMax);
  UsbRequest UsbRequest=new UsbRequest ();
  usbRequest。初始化(连接,inEndpoint);
  usbRequest。队列(byteBuffer, inMax);
  如果(connection.requestWait ()==usbRequest) {
  byte [] retData=https://www.yisu.com/zixun/byteBuffer.array ();
  (字节byte1: retData) {
  System.err.println (byte1);
  }
  }

Android中将USB装换为串口通信的方法