FTDI драйвер (Windows) FT_Write() проблема с большим (1 КБ) чанком - (версия 2.12.16.0)

Мое приложение на ПК отправляет файл (2 МБ) кусками по 1 КБ на встроенное устройство.

Я использую драйвер FTDI для Windows, я использую классическую функцию API FT_Write(), так как мой код кроссплатформенный.

Примечание. Приведенные ниже проблемы появляются, когда я использую размер блока 1 КБ. Меньший кусок (я пробовал 64 байта) работает нормально.

Проблема в том, что функция возвращает 0 отправленных байтов каждые пару сотен пакетов и застряла. Я нашел обходной путь, очистив оба TX и Rx, а затем вызов ResetDevice() восстановил чип. Это по-прежнему происходило каждые пару сотен пакетов, но, по крайней мере, я могу отправить весь файл (2 МБ).

Но когда я использую USB-изолятор ( http://www.bb-elec.com/Products/USB-Connectivity/USB-Isolators/Compact-USB-Port-Guardian.aspx), обходной путь не удался.

Я считаю, что моя работа не является изящным решением.

Примечание: я использую большой кусок из-за предложения, которое я нашел в примечании к приложению FTDI ниже:

При записи данных на устройство FTDI в приложении должно быть буферизировано как можно больше данных и записано на устройство одним вызовом функции записи (либо WriteFile для приложения VCP с использованием Win32 API, FT_Write при использовании классического интерфейса D2XX или FT_WriteFile, если используется интерфейс FT_W32 D2XX). Результатом этого является то, что данные будут записаны на устройство с 64 байтами на пакет USB.

Есть идеи, как правильно решить эти проблемы? Это связано с инициализацией FTDI? Моя версия драйвера - 2.12.16.0 (09.03.2016).

1 ответ

  1. Я также видел ту же проблему с API FT_Write(), работающим неправильно, если было передано слишком много данных во время работы над библиотекой для моего USB-устройства Nusbio. В основном я работаю в режиме Synchronous Bitbanging, а не в UART, но в конце концов это то же самое оборудование, драйвер и API.

  2. Есть спецификация USB 2.0 или спецификация FTDI FT232RL, а также реальность электронов и битов. Ожидаемые значения скорости передачи никогда не совпадают, по крайней мере, на первый взгляд. Другими словами, это сложно (см. Подробнее ниже в моем сообщении в блоге).

  3. В 2015 году у меня сложилось впечатление, что с FTDI-чипом FT232RL размер в 384 байта работал хорошо, и число исходит из таблицы данных чипа (128-байтовый приемный буфер и 256-байтовый буфер передачи). Использование размера 500 байт все еще будет работать, но более 600 байтов не сработает.

    Позже я использовал чип FT231X, который имеет больший буфер (1k, 512-байтовый буфер приема и 512-байтовый буфер передачи). и был в состоянии передать с FT_Write() 1 КБ и 2 КБ буфера данных, поэтому более чем удвоил мою скорость передачи. Но выше 2к все не получится.

  4. В 2016 году я прочитал все, что вы можете прочитать о FTDI USB 2.0 Full speed chip, и пришел к выводу, что FT_Write должен поддерживать до 64 КБ (см. Таблицу данных для следующего чипа FT232RL, FT231X, FT232H, FT260, FT4222).

Я также провел некоторые исследования по более быстрой связи через последовательный порт из.NET, чем 115200 бод.

Каким-то образом мне удалось обновить мою библиотеку C# для отправки данных в буфер размером 32 КБ в FT_Write (), и она работает с FT232RL и чипом FT231X, но я не могу сказать вам, что изменилось. Я, вероятно, не совсем недооценивал входящую и исходящую технологию USB 2.0 full speed FTDI.

Например, предположим, что вы используете FT232RL и одновременно переносите 384 байта с помощью FT_Write(). Зная, что при полной скорости USB 2.0 по крайней мере 1 миллисекундная задержка, что бы вы ни делали, вы переносите с точки зрения USB 384*1000/1024, то есть теоретически 375 Кбайт / с (это было бы макс), который сказал теперь, какая скорость передачи данных поддерживается вашим встроенным устройством. Какой используется скорость передачи данных? Максимальная скорость передачи FT232RL составляет 900 000 бод, что даст вам только 900000/(1+8+1) == 87 Кбайт / с. Сразу же вы можете сказать, что возникнет какая-то проблема, возможно, драйвер FTDI позаботится об этом или нет. Я не могу сказать. Повторите математические расчеты на основе скорости передачи данных, поддерживаемой вашим встроенным устройством, и 384-байтового буфера, отправляемого 1000 в секунду, а затем замедлите скорость USB с помощью sleep(), чтобы соответствовать вашей скорости передачи.

Вот где я бы начал.

Другие вопросы по тегам