android 通过usb 读取数据

          背景介绍:

                      老大忽然跟我说:今天你做一个东西,能确保我们的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



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值