我已经实现了一个Android应用程序,它通过蓝牙LE与DLP NIRscan Nano通信。它工作正常,但不幸的是,传输扫描结果需要很长时间 - 特别是如果你想连续进行几次单独的扫描。
这就是为什么我目前正试图通过USB OTG线将设备连接到Android智能手机。我可以通过USB成功连接到设备,但目前还不清楚如何读取或写入数据。
到目前为止我所理解的是:
设备提供两个端点:一个是IN方向,另一个是OUT方向。
两个端点都有中断类型,这就是我需要使用queue()和requestWait()方法异步通信的原因(参见https://developer.android.com/reference/android/hardware/usb/UsbRequest.html)。
根据文档,设备使用HID 1.1来交换命令。一个示例项目是Missile Launcher:https://github.com/aosp-mirror/platform_development/blob/master/samples/USB/MissileLauncher/src/com/android/missilelauncher/MissileLauncherActivity.java正在使用
UsbRequest#queue()
sendCommand()
mConnection.controlTransfer(0x21, 0x9, 0x200, 0, message, message.length, 0);
requestWait()
等待响应可用。
但这并不奏效。同时将sendCommand更改为
int transfer = mConnectionRead.controlTransfer(0xA1, 0x01, 0x00, 0x01, message, message.length, 0);
不起作用(transfer = -1),请参阅Using Android to Communicate with a USB HID Device 当我想阅读时,例如蒂瓦版本信息,我认为它将像下面提到的代码一样工作。 设备规格:http://www.ti.com/lit/ug/dlpu030g/dlpu030g.pdf,请参阅第83页
为什么不起作用?我从未得到传感器的任何响应。
我必须使用controlTransfer吗?数据包错了吗?是否可以通过USB将扫描仪连接到Android智能手机?
任何帮助表示赞赏: - )
由于 本
UsbConfiguration usbConfiguration = usbDevice.getConfiguration(0);
UsbInterface usbInterface = usbConfiguration.getInterface(0);
inEndpoint = usbInterface.getEndpoint(0);
outEndpoint = usbInterface.getEndpoint(1);
connection = usbManager.openDevice(usbDevice);
connection.claimInterface(usbInterface, true);
byte[] data = new UsbPacket()
.setGroupByte((byte) 0x02)
.setCommandByte((byte) 0x16)
.setFlagRW(UsbPacket.RW.READ)
.setFlagReady(UsbPacket.READY.READY)
.toByteArray();
UsbRequest request = new UsbRequest();
request.initialize(connection, outEndpoint);
request.queue(ByteBuffer.wrap(data), data.length);
connection.requestWait();
UsbRequest request1 = new UsbRequest();
request1.initialize(connection, inEndpoint);
byte[] result = new byte[28];
request1.queue(ByteBuffer.wrap(result), result.length);
connection.requestWait(); // Actual: never terminates!
// Expected: result byte array contains Tiva version information
class UsbPacket {
private byte flags;
private int sequence = 0;
private byte commandByte;
private byte groupByte;
private byte[] data;
enum RW {
WRITE,
READ
}
enum READY {
BUSY,
READY
}
enum ERROR {
SUCCESS,
ERROR,
BUSY
}
UsbPacket setFlagRW(RW flag) {
if (flag == RW.READ) {
this.flags = (byte) (this.flags | 0x80);
}
return this;
}
UsbPacket setFlagReady(READY flag) {
if (flag == READY.READY) {
this.flags = (byte) (this.flags | 0x40);
}
return this;
}
UsbPacket setFlagError(ERROR flag) {
if (flag == ERROR.ERROR) {
this.flags = (byte) (this.flags | 0x20);
}
if (flag == ERROR.BUSY) {
this.flags = (byte) (this.flags | 0x10);
}
return this;
}
UsbPacket setSequence(int sequence) {
if (0 > sequence || sequence > 255) {
throw new IllegalArgumentException("Only values from 0 to 255 are allowed");
}
this.sequence = sequence;
return this;
}
UsbPacket setCommandByte(byte commandByte) {
this.commandByte = commandByte;
return this;
}
UsbPacket setGroupByte(byte groupByte) {
this.groupByte = groupByte;
return this;
}
public UsbPacket setData(byte[] data) {
this.data = data;
return this;
}
byte[] toByteArray() {
byte[] dataLength;
int lengthOfCommandBytes = 2;
if (data != null) {
dataLength = ConvertUtility.convertTo2ByteArray(lengthOfCommandBytes + data.length);
}
else {
dataLength = ConvertUtility.convertTo2ByteArray(lengthOfCommandBytes);
}
byte[] header = new byte[] {
0x00,
flags,
(byte) sequence,
dataLength[0],
dataLength[1],
commandByte,
groupByte
};
byte[] packet;
if (data != null) {
packet = new byte[7 + data.length];
System.arraycopy(header, 0, packet, 0, header.length);
System.arraycopy(data, 0, packet, 7, data.length);
}
else {
packet = header;
}
return packet;
}
}