1、注册receiver
permissionIntent = PendingIntent.getBroadcast(activity, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
activity.registerReceiver(mUsbReceiver, filter);
activity.registerReceiver(mUsbReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED));
2、获取USB列表
usbMgr = (UsbManager)activity.getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbMgr.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
while (deviceIterator.hasNext())
{
UsbDevice usd = deviceIterator.next();
if(usd.getVendorId() == vendorId && usd.getProductId() == productId) {
usbDevice = usd;
break;
}
}
3、获得权限
try{
if(usbDevice != null) {
usbMgr.requestPermission(usbDevice, permissionIntent);
}
}catch(Exception e) {
}
4、实现BroadcastReceiver
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
if(device != null){
usbInterface = device.getInterface(0);
for(int i = 0; i < usbInterface.getEndpointCount(); i++) {
UsbEndpoint ep = usbInterface.getEndpoint(i);
if(ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK
&& ep.getDirection() == UsbConstants.USB_DIR_OUT) {
usbEndpoint = ep;
}
}
usbConn = usbMgr.openDevice(device);
usbConn.claimInterface(usbInterface, forceClain);
configUsb();
}
}
else {
Log.d("SerailTest", "permission denied for device " + device);
}
}
}
}
}
};
配置usb方法,以CH341串口芯片为例:
byte[] buffer = new byte[8];
usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_IN , 0x5f, 0, 0, buffer, 8, 1000);
usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0xa1, 0, 0, null, 0, 1000);
//baud rate
int baudRate = 4800;
long factor = 1532620800 / baudRate;
int divisor = 3;
while((factor > 0xfff0) && (divisor > 0)) {
factor >>=3;
divisor--;
}
factor = 0x10000-factor;
short a = (short) ((factor & 0xff00) | divisor);
short b = (short)(factor & 0xff);
usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0x9a, 0x1312, a, null, 0, 1000);
usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0x9a, 0x0f2c, b, null, 0, 1000);
usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_IN, 0x95, 0x2518, 0, buffer, 8, 1000);
usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0x9a, 0x0518, 0x0050, null, 0, 1000);
usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0xa1, 0x501f, 0xd90a, null, 0, 1000);
usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0x9a, 0x1312, a, null, 0, 1000);
usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0x9a, 0x0f2c, b, null, 0, 1000);
usbConn.controlTransfer(UsbConstants.USB_TYPE_VENDOR | UsbConstants.USB_DIR_OUT , 0xa4, 0, 0, null, 0, 1000);