0

我一直在尝试解决这个问题,但是我所看到的每种方法都行不通,我正在尝试将一些字符串数据发送到 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;
4

1 回答 1

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)(假设它们是一个接口中的两个第一个端点)。

顺便说一句:你的字节缓冲区太大了。批量传输数据包的最大大小对于全速设备是 64 字节,对于高速设备是 512 字节。

于 2012-05-19T18:57:04.153 回答