2

AndroidでカスタムメイドのUSBデバイス(スレーブとして動作)からデータを読み込もうとしています。次のコードを使用して、デバイスにデータを書き込むことができました。

UsbRequest request = new UsbRequest();
request.initialize(_outConnection, _outEndpoint);

int bufferDataLength = _outEndpoint.getMaxPacketSize();

ByteBuffer buffer = ByteBuffer.allocate(bufferDataLength + 1);
buffer.put(bytes);
if (request.queue(buffer, bufferDataLength)) {
            UsbRequest req = _outConnection.requestWait(); }

デバイスが接続されているデバッグ ボードに結果が表示されます。データを読み取るために同じアプローチを試みていますが、明らかにうまくいきません:

int siz = 1; 
ByteBuffer res = ByteBuffer.allocate(siz + 1);
UsbRequest request = new UsbRequest();
request.initialize(_inConnection, _inEndpoint);
request.queue(res, siz); // This return false always

私は何を間違っていますか?送り返されたパケットのサイズはわかりませんが、常に読み取ることができるのは 1 バイトだと思います。

私のデバイスには、2 つの割り込みエンドポイント (IN と OUT) を持つ HID インターフェイスがあります。

4

1 に答える 1

1

何が問題を解決したのかわかりませんが、今では機能しています。すべてを一から書き直しました。私はこのコードを使用しなかったと思います(ユーザー通知用だと思っていたので必要ありません。しかし、それは別のもののようです)-それが機能しなかった主な理由でした:

// Create and intent and request a permission.
    PendingIntent mPermissionIntent = PendingIntent.getBroadcast(_context, 0, new Intent(ACTION_USB_PERMISSION), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    _context.registerReceiver(mUsbReceiver, filter);

私が行った、安定した接続を実装するのに役立ったいくつかのことは次のとおりです。

1)必要なたびに接続を閉じたり開いたりします。奇妙に聞こえるかもしれませんが、これが安定させる唯一の方法です。長期接続を使用しようとすると、何らかの理由で破損し、しばらくすると動作しなくなります。

2) 終わりのない while ループで継続的に読み取ります。また、すべてのスレッドに短いスリープを設定しました。これにより、よりリアルタイムで読むことができました。

3) デバイスのロック (同期)。書き込み接続と読み取り接続の両方を同時に開くことはありません。

このプロジェクトには多くの時間が割り当てられていませんでした。このプロジェクトはデモにすぎません。したがって、これらすべてが私たちにぴったりでした。もう少し時間があれば、これらのいくつかはより良いものに書き直された可能性があると思います。

于 2013-04-04T08:33:39.243 に答える