android 通过usb 读取数据

来源:互联网 发布:java小游戏源代码文件 编辑:程序博客网 时间:2024/05/21 07:50

          背景介绍:

                      老大忽然跟我说:今天你做一个东西,能确保我们的usb外设发送的数据能被接受到。

           然而,作为一个android零基础 的小白(初创公司真是身兼多职~。~),只能各种找资料,最后 ac了。


一、查找大概的代码:

在activity下开一个线程,传usbManager,代码如下:

<span style="font-size:18px;">package com.example.administrator.acceptusbdata;import android.content.Context;import android.hardware.usb.UsbDevice;import android.hardware.usb.UsbManager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import java.util.HashMap;import java.util.Iterator;public class MainActivity extends AppCompatActivity{    @Override    protected void onCreate(Bundle savedInstanceState) {        final String TAG = "onCreate";        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        UsbManager usbManager = (UsbManager)getSystemService(Context.USB_SERVICE); //getSystemService只能在activity下使用        new Thread(new MyThread(1,usbManager)).start(); //启动线程    }}</span>


另写的线程:

package com.example.administrator.acceptusbdata;import android.content.Context;import android.hardware.usb.UsbDevice;import android.hardware.usb.UsbDeviceConnection;import android.hardware.usb.UsbEndpoint;import android.hardware.usb.UsbInterface;import android.hardware.usb.UsbManager;import android.hardware.usb.UsbRequest;import android.util.Log;import java.nio.ByteBuffer;import java.util.HashMap;import java.util.Iterator;/** * Created by Administrator on 2016/9/28 0028. */public class MyThread implements Runnable  {    int count=1,number;    UsbManager mUsbManager;    public MyThread(int num,UsbManager usbManager)    {        number=num;        System.out.println("创建线程"+number);        mUsbManager = usbManager;    }    public void run() {        while (true) {            System.out.println("线程" + number + ":计数" + count);            HashMap<String,UsbDevice> deviceHashMap = mUsbManager.getDeviceList();            Iterator<UsbDevice> iterator = deviceHashMap.values().iterator();            System.out.println("deviceHashMap.isEmpty()"+deviceHashMap.isEmpty());            while(iterator.hasNext()) {                UsbDevice usbDevice = iterator.next();                UsbInterface usbInterface = usbDevice.getInterface(0);//USBEndpoint为读写数据所需的节点                UsbEndpoint inEndpoint = usbInterface.getEndpoint(0);  //读数据节点                UsbDeviceConnection connection = mUsbManager.openDevice(usbDevice);                connection.claimInterface(usbInterface, true);                //发送数据                byte[] byte2 = new byte[1024];                //读取数据1   两种方法读取数据                int ret = connection.bulkTransfer(inEndpoint, byte2, byte2.length, 3000);                System.out.println("ret");                Log.i("ret", "ret:" + ret);                Log.i("ret", "bat is ok  length:" + byte2.length);                for (Byte byte1 : byte2) {                    Log.i("ret", "byte1 :" + byte1);                }            }        }    }}

参考链接:http://blog.csdn.net/centralperk/article/details/9312401



二、getDeviceList()搜索不到设备

     在以上基础下,遇到一个问题:getDeviceList()搜索不到设备:

     然后参考链接中的方法解决了,不过其中push文件到android设备、编辑andoird文件等操作 都是同事帮着完成的~毕竟android小白。。


三、系统签名

     当时装上后报错说权限不够,同事帮给app签名后就ok了。


至此就能搜索到设备了。但是接受数据还有问题,后面发现是byte数组开小了,usb外设是直接发一个包过来的,包的size 比数组大就直接不存进去(而不是覆盖存入),改了byte数组大小就success了。


最后附上两个参考链接,帮助理解api:

http://home.bdqn.cn/thread-67074-1-1.html

https://developer.android.com/reference/android/hardware/usb/package-summary.html



0 0
原创粉丝点击