Подтвердить что ты не робот

API хоста Android USB: размер буфера массовой загрузки

Я пишу программное обеспечение для общения между планшетами (Motorola Xoom с Android версии 4.0.3 и версией ядра 2.6.39.4) и периферийным устройством с использованием USB Host API от Android. Я использую только два типа связи:

  • control - controlTransfer (int requestType, int request, int value, int index, byte [] buffer, int length, int timeout)
  • объем - bulkTransfer (конечная точка UsbEndpoint, байт [] buffer, int length, int timeout)

Передача управления работает нормально, но у меня есть проблема с массовым переносом. Я могу использовать только 32768 в качестве размера буфера для функции bulkTransfer. Нельзя использовать меньше или больше. Я знаю, что больше не могу использовать из-за предела буферной трубы (размер: 32769 байт).

Это периферийное устройство передает данные, которые неправильно считываются функцией bulkTranfer. Я полагаю, что некоторые данные потеряны.

Я нахожу это: В Linux Если процесс пытается прочитать из пустого канала (буфера), тогда чтение (2) будет блокироваться до тех пор, пока не будут доступны данные, Если процесс пытается записать в полный канал, тогда напишите (2) блоки до тех пор, пока достаточное количество данных не будет считано из канала, чтобы завершить запись.

И исходя из этого, мое объяснение проблемы состоит в том, что некоторые данные не записываются в pipe (buffer) из-за блокировки флага, созданного функцией write (2). Я прав? Если это правда, я могу изменить буфер буфера.

Кто-нибудь сталкивался с той же проблемой, какие-либо решения?

4b9b3361

Ответ 1

Вы должны получить USB-анализатор данных, Im используя этот: http://www.ellisys.com/products/usbex200/index.php

Использование чего-то подобного действительно помогло мне, когда я делал то же самое, я обнаружил, что вам нужно сделать какой-то цикл while.

Для моего устройства у меня было 64 байта данных, поступающих в пакеты для меня, для пакета было бы два контрольных байта и 62 для данных, поэтому для моей передачи мне пришлось сделать что-то вроде

StringBuilder sb = new StringBuilder();
while(bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout) > 2){
    for(int i = 2; i < buffer.length(); i++){
        sb.append((char) buffer[i]);
    }
}

что-то длинное, эти строки работали хорошо для меня, у меня была точно такая же проблема, и именно так я ее исправил. У меня есть дополнительная информация, если вам это нужно. Просто комментарий:). Я знаю, что это было очень неприятно для меня. Я использую Acer Iconia A500 с Android 4.0.3 btw


Перенос больших объемов данных USB

Передача данных USB

Ответ 2

В соответствии с тем же сообщением .pdf gfour, я нашел этот абзац там:

"Размер пакета влияет на производительность и зависит от скорости передачи данных. Для очень высокой скорости необходим самый большой размер пакета. Для приложений реального времени, которые передают аудиоданные при 115200 бод, например, желательно минимальный возможный пакет, в противном случае устройство будет поддерживать одновременно 4 тыс. данных. Это может привести к передаче" отрывистых "данных, если размер запроса USB слишком велик, а скорость передачи данных слишком низкая (относительно)."

Я столкнулся с ситуацией, подобной SmartLemon с последовательным устройством FTDI, поэтому я недавно искал способы ее устранения. Это потребует от меня в значительной степени написать свои собственные функции с нуля, а раньше я использовал библиотеку.

Однако, похоже, что в вашем случае вы можете попробовать использовать самый низкий размер буфера bulkTransfer вместо съемки для самого большого. Возможно, вы уже пробовали это, но, возможно, нет. Я вижу, что вы говорите, что 32768 - это единственный размер, но, возможно, вы имели в виду только макс. Кажется странным, что он разрешил бы только один конкретный размер.

Ответ 3

В соответствии с AN232B-04_DataLatencyFlow.pdf управление потоком требуется для высоких скоростей передачи данных:

Настоятельно рекомендуется, чтобы управление потоком использовалось, поскольку оно невозможно гарантировать, что драйвер FTDI будет всегда планироваться.

Пробовали ли вы использовать одну из опций управления потоком (RTS/CTS, DTR/DSR, XON/XOFF) для синхронизации ваших данных?

Ответ 4

Объект Android SDK UsbEndpoint предоставляет метод getMaxPacketSize(), позволяющий вам проверить, что подходит для вашего устройства. Как правило, максимально допустимый размер пакета составляет 64 байта для USB-устройств "Full-Speed" и 512 для "высокоскоростных" устройств - гораздо меньше, чем 32 768, которые вы пытаетесь выполнить. Возможно, вы путаете базовый размер пакета USB с протоколом более высокого уровня?

Ответ 5

Вы можете попробовать это для проблемы с массовой доставкой

byte[] buffer = new byte[4096];

            StringBuilder strIN = new StringBuilder();

            if (conn.bulkTransfer(epIN, buffer, 4096, 500) >= 0) {
                for (int i = 2; i < 4096; i++) {
                    if (buffer[i] != 0) {
                        strIN.append((char) buffer[i]);

                        textReceiveDataInfo.append(strIN + "\n");
                    } else {
                        l(strIN);
                        break;
                    }
                }

            }