我一直试图解决这个问题一段时间了,但是我看到的每一种方式都不起作用,我试图将一些字符串数据发送到USB设备,设备应该发回数据我想要或发回“坏命令”,大约11个字节对吗?现在我回来只有2个字节,1和192.我试图总共发送9个字节,“$ fdump G”和“/ n”。无论我做什么,它都行不通。
这也是我的代码,我不知道如何将字节更改为字符串或字符,但是一旦我开始获取数据,我会这样做,因为我知道返回的内容至少是11个字节。
for(;;){//this is the main loop for transferring
String get = "$fDump G\n";
l("Sending: " + get);
byte[] by = get.getBytes();
//This is where it sends
l("out " + conn.bulkTransfer(epOUT, by, by.length, 500));
//This is where it is meant to receive
byte[] buffer = new byte[4096];
l("in " + conn.bulkTransfer(epIN, buffer, 4096,500));
StringBuilder byStr = new StringBuilder();
//This shows what's coming in
for(int i = 0; i < buffer.length; i++){
if(buffer[i] != 0){
byStr.append(buffer[i]);
l(byStr);}
}
//this shows the complete string
l(byStr);
if(mStop){
mStopped = true;
return;
}
l("sent "+counter);
counter++;
counter = (byte) (counter % 16);
}
我真的不知道为什么它不起作用。我在Android方面有很多技巧,但我无法理解这一点。
enIN和enOUT是终点:
epIN = usbIf.getEndpoint(i);
epOUT = usbIf.getEndpoint(i);
conn也是USB设备连接。
UsbDevice dev = sDevice;
if (dev == null)
return;
UsbManager usbm = (UsbManager) getSystemService(USB_SERVICE);
UsbDeviceConnection conn = usbm.openDevice(dev);
l("Interface Count: "+dev.getInterfaceCount());
l("Using "+String.format("%04X:%04X", sDevice.getVendorId(), sDevice.getProductId()));
if(!conn.claimInterface(dev.getInterface(0), true))
return;
答案 0 :(得分:1)
epIN = usbIf.getEndpoint(i);
epOUT = usbIf.getEndpoint(i);
如果此处i
(端点索引)对于两个呼叫具有相同的值,则最终将使用相同的端点。然而,端点具有方向,不能用于发送和接收数据。由于bulkTransfer()
方法使用端点地址来确定分别以两次读取或两次写入结束的方向。
请注意,接口中的端点索引与端点地址不匹配。接口是端点的逻辑映射(具有硬件地址)。
我猜你可能想从IN端点1(地址:0x81)读取并写入OUT端点1(地址:0x01)。因此,i
使用的值相同但IN 1和OUT 1的端点不同。
检查设备描述符以找出要与之通信的端点。接口描述符之后的第一个提到的端点可以通过UsbInterface.getEndpoint(0)
访问,而不管其物理地址如何。检查该端点的方向并正确使用它。使用UsbInterface.getEndpoint(1)
查找其他端点(假设它们是一个接口中的两个第一个端点)。
btw:你的字节缓冲区太大了。批量传输数据包的最大大小为全速64字节,高速设备512字节。