0

私はしばらくの間これを理解しようとしていますが、私が見たすべての方法がうまくいかず、USBデバイスに文字列データを送信しようとしています。デバイスは必要なデータを返送するか、送信する必要があります約11バイトである「悪いコマンド」を返しますか?今のところ、戻ってきたのは1バイトと192バイトの2バイトだけです。「$fdumpG」と「/n」の合計9バイトを送信しようとしています。私が何をしても、それはうまくいきません。

これも私のコードです。バイトを文字列または文字に変更する方法はわかりませんが、データを取得し始めたら、返されるのは少なくとも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()メソッドはエンドポイントアドレスを使用して、それぞれ2回の読み取りまたは2回の書き込みで終わる方向を決定します。

インターフェイスのエンドポイントインデックスがエンドポイントアドレスと一致しないことに注意してください。インターフェイスは、エンドポイント(ハードウェアアドレスを持つ)の論理マッピングです。INエンドポイント1(アドレス:0x81)から読み取り、OUTエンドポイント1(アドレス:0x01)に書き込むことをお勧めします。そのため、に同じ値を使用していますが、iIN1とOUT1は同じエンドポイントではありません。

デバイス記述子を調べて、通信するエンドポイントを見つけます。インターフェイス記述子の後に最初に記載されたエンドポイントUsbInterface.getEndpoint(0)は、物理アドレスに関係なく経由でアクセスできます。その端点の方向を確認し、適切に使用してください。を使用して他のエンドポイントを検索しますUsbInterface.getEndpoint(1)(1つのインターフェイスの最初の2つのエンドポイントであると想定します)。

ところで:バイトバッファが大きすぎます。バルク転送パケットの最大サイズは、フルスピードの場合は64バイト、ハイスピードデバイスの場合は512バイトです。

于 2012-05-19T18:57:04.153 に答える