USB转Android

时间:2012-05-17 22:30:14

标签: java android usb

我一直试图解决这个问题一段时间了,但是我看到的每一种方式都不起作用,我试图将一些字符串数据发送到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;

1 个答案:

答案 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字节。