USB-хост Android - bulkTransfer () теряет данные

Пытаюсь получить данные с нестандартного устройства на базе микросхемы FTDI 2232H.

Я использую простой режим Async FIFO, скорость входящих данных составляет 3,2 МБ / с.

Все работает отлично с тестовым кодом на моем ПК, но у меня проблемы с получением данных на моем Toshiba Thrive.

Драйвер TDI для Android не работает, поэтому я пишу код на Java.

Я могу получить более 95% данных безупречно, но время от времени данные «разбрызгиваются», и я получаю части одних и тех же 4–5 КБ данных два или три раза, а затем возвращаюсь к надежным данным.

Я не собираюсь слишком быстро переходить к Thrive или Android, потому что раньше у меня данные приходили с двойной скоростью (6,4 МБ / сек), и они также получали около 95% от этого числа. (Так что на половине скорости проблем быть не должно.)

Похоже, что в Android есть какая-то ошибка в буферизации (или двойной буферизации). (Это не буфер в FTDI 2232H, потому что повторяемые данные больше, чем внутренний буфер 4K чипа.)

Код настройки прост, и снова он работает ~ почти ~ идеально.

Цикл, в котором происходит захват данных, очень прост:

while(!fStop)
  if(totalLen < BIG_BUFF_LEN-IN_BUFF_LEN)
  {
    len=conn.bulkTransfer(epIN, inBuff, IN_BUFF_LEN, 0);
    System.arraycopy(inBuff, 0, bigBuff, totalLen, len);
    totalLen+=len;
  }

Если вы думаете, что это задержка по времени для копирования массива - я все равно потеряю данные, даже если закомментирую эту строку.

IN_BUFF_LEN равен 16384 (bulkTransfer не вернет больше, даже если я увеличу размер inBuff).

Размер bigBuff составляет несколько мегабайт.

В качестве второстепенного вопроса - кто-нибудь знает, как передать указатель на bulkTransfer, который будет заполнять bigBuff напрямую --- со смещением (не начиная с позиции '0'?

37
задан Greg 2 February 2012 в 13:57
поделиться