Вопрос по android – Android USB Host API: размер буфера массовой передачи

13

Я пишу программное обеспечение дляcommunicate between tablet (Motorola Xoom с версией Android 4.0.3 и версией ядра 2.6.39.4)and a peripheral device using USB Host API предоставлено Android. Я использую только два типа общения:

  • control: controlTransfer(int requestType, int request, int value, int index, byte[] buffer, int length, int timeout)
  • bulk: bulkTransfer(UsbEndpoint endpoint, byte[] buffer, int length, int timeout)

Управление передачей работает нормально, но у меня естьa problem with bulk transfer. I can use only 32768 as a size of the buffer for bulkTransfer function. It is not possible to use less or more. I know that I cannot use more because of the limit of the buffer pipe (size: 32769 bytes).

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

Я нахожу это:In Linux If a process attempts to read from an empty pipe (buffer), then read(2) will block until data is available. If a process attempts to write to a full pipe , then write(2) blocks until sufficient data has been read from the pipe to allow the write to complete.

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

  1. My first solution for this problem is greater buffer. For kernel >= 2.6.35, you can change the size of a pipe with fcntl(fd, F_SETPIPE_SZ, size) but how can I find fd (file descriptor) for USB pipes?
  2. Second option is to use ulimit -p SIZE but parameter p for my kernel is not for pipe but process.

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

Хорошо, спасибо за информацию. syntagma
используя массовую передачу, также сталкиваюсь с проблемой потери данных. увлекаюсь этим. Я дам вам знать, как только я найду основную причину. постоянно обновлять статус. yokks
@yokks Я уже видел, что это мне не помогло. syntagma
android.serverbox.ch/?p=370  ты можешь пройти этот разговор? здесь представлена одна логика для обработки входящих данных. надеюсь, это поможет вам. yokks
Я основал свои вещи на серверной коробке с небольшим редактированием, я прошел через то же самое. Было разочарование FabianCook

Ваш Ответ

5   ответов
1

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

-1

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

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;
                    }
                }

            }
0

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

It is strongly encouraged that flow control is used because it is impossible to ensure that the FTDI driver will always be scheduled.

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

Я не пробовал управление потоком. Я не должен использовать такого рода решение, потому что это вызовет дополнительную задержку. Я проанализировал USB-передачу между устройством и платформой Windows, и нет никакого контроля потока. syntagma
@ REACHUS: Моя ситуация похожа: чтение из FTDI работает нормально на моем компьютере с Linux, но теряет данные на планшете Android. Поскольку я выполняю около 400 Кбит / с непрерывной передачи данных (запись звука через USB), я подозреваю, что, возможно, комбинация аппаратного обеспечения / ядра / драйвера планшета ведет себя неправильно на высоких скоростях передачи данных. Как и вы, я знаю, что в моем случае с Linux управление потоком не выполняется, но, возможно, на Android все по-другому, поэтому рекомендация.
2

Вы должны получить анализатор данных USB, я использую этот: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 кстати


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

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

У меня нет такого рода устройства. Я использовал только USBlyzer для проверки передачи между устройством и платформой Windows. Я не получаю никаких контрольных данных в bulkTransfer и, вероятно, максимальный размер пакета составляет 512 байт. Есть ли у вас предложения? syntagma
1

Согласно тому же .pdf gfour, я нашел этот параграф там:

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

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

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

Похожие вопросы