Android-асинхронный USB читает в ByteBuffer, но не может определить размер - PullRequest
2 голосов
/ 15 июня 2011

Я читаю байты с USB-устройства на основе FTDI в ОС Android 3.1 (на Motorola Xoom), используя недавно добавленный USB API для Android: http://developer.android.com/guide/topics/usb/host.html

Однако я работаюв проблему при выполнении асинхронного чтения.

        ByteBuffer bb = ByteBuffer.allocate(128);
        UsbRequest request = new UsbRequest();
        request.initialize(deviceConnection, deviceInterface.getEndpoint(0));
        boolean sent = request.queue(bb, 128);
        request = deviceConnection.requestWait();
        if(request.getEndpoint() == deviceInterface.getEndpoint(0)) {
            // Send a message to the Activity with the read array
            Message msg = usbTest.handleAsyncMessage.obtainMessage();
            msg.obj = bb.array()
            usbTest.handleAsyncMessage.sendMessage(msg);
        }

Эта функция правильно считывает байты с устройства.Тем не менее, это не говорит мне, сколько читается.bb.position () всегда возвращает 0, а bb.remaining () всегда возвращает 128. Я не могу гарантировать, что мое чтение вернет 128 байтов (может считывать, например, запрашивать состояние устройства, отправлять только около 12 байтов), и у меня естьнет способа определить, где заканчивается чтение и начинается мусор в ByteBuffer.Я пытался перематывать ByteBuffer, но при чтении метка не устанавливается.Есть ли способ точно определить, сколько байтов читается?

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

Видимо, вы не можете. Недостаток поддержки Android в USB. (

См. Как определить длину полученных байтов метода UsbRequest.queue (..)?

0 голосов
/ 15 июня 2011

Я не уверен, что это ваша проблема, но похоже, что вы должны сделать что-то особенное при работе с конечной точкой 0. Из javadocs UsbRequest :

Запросыв конечной точке ноль не поддерживаются этим классом;используйте controlTransfer (int, int, int, int, byte [], int, int) для запросов нулевой конечной точки вместо.

...