我需要使用 android 主机 API 与 USB 通信设备进行通信
这是我正在使用的设备的信息。
lsusb -v -d PID:VID
总线 003 设备 007:ID PIDVID VOTI
设备描述符:
bLength 18
bDescriptorType 1
bcdUSB 1.01
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor PID VOTI
idProduct VID
bcdDevice 1.00
iManufacturer 1
iProduct 2
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 67
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
接口描述符:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 0
CDC Header:
bcdCDC 1.10
CDC ACM:
bmCapabilities 0x02
line coding and serial state
CDC Union:
bMasterInterface 0
bSlaveInterface 1
CDC Call Management:
bmCapabilities 0x03
call management
use DataInterface
bDataInterface 1
端点描述符:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 100
接口描述符:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 0
端点描述符:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0006 1x 6 bytes
bInterval 0
端点描述符:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
bInterval 0
现在我可以发现设备并获得与设备通信的权限。但是当我尝试使用 bulkTransfer() 函数与设备通信时,它总是返回-1。
这是代码
UsbDeviceConnection conn = mUsbManager.openDevice(mDevice);
conn.controlTransfer(33, 34, 0, 0, null, 0, 0);
byte[] buffer = new byte[]{ (byte) 0x80,0x25, 0x00, 0x00, 0x00, 0x00, 0x08 };
conn.controlTransfer(33, 32, 0, 0, buffer , 7, 0); //8N1, 9600 baud
conn.bulkTransfer(epOUT, new byte[]{msData}, 1, 0);
UsbEndpoint epIN = null;
UsbEndpoint epOUT = null;
UsbInterface usbIf = mDevice.getInterface(1);
for (int i = 0; i < usbIf.getEndpointCount(); i++) {
if (usbIf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
if (usbIf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN)
epIN = usbIf.getEndpoint(i);
else
epOUT = usbIf.getEndpoint(i);
}
}
for (;;) {// this is the main loop for transferring
synchronized (sSendLock) {//ok there should be a OUT queue
try {
sSendLock.wait();
} catch (InterruptedException e) {
if (mStop) {
mConnectionHandler.onUsbStopped();
return;
}
e.printStackTrace();
}
}
conn.bulkTransfer(epOUT, new byte[] { mData }, 1, 0);
if (mStop) {
mConnectionHandler.onUsbStopped();
return;
}
}