Получение данных через мост FTDI: опыт практического применения
Листая страницы интернета, наткнулся на интересную статью «Введение в разработку USB периферии», что побудило меня поделиться своим опытом разработки ПО для работы с мостами фирмы FTDI с использованием драйверов D2XX на примере FT245BM (Для остальных аналогично). Для всех, кто не знаком с данным продуктом, тут лежит небольшой обзор на русском языке.
Немного о драйверах D2XX
Драйверы D2xx включают драйвер WDM, который осуществляет связь с устройством через Windows USB Stack и библиотеку DLL, которая связывает прикладное программное обеспечение (написанное на VC++, Borland C++ Builder, Delphi, VB, C# и т.п.) с драйвером WDM.
В описании текущей 2.06.02 версии драйверов говорится что они имеют сертификат WHQL. Однако на момент моей работы над этой задачей они еще не были сертифицированы и для работы в Windows Vista x64 и Windows 7 x64 приходилось при каждом запуске ОС отключать проверку цифровой подписи драйверов (Во время загрузки ОС нажать F8 и выбрать режим без проверки цифровых подписей, либо воспользоваться этими советами).
Программирование
Должен отметить, что документация по работе с продуктами FTDI составлена превосходно, на сайте производителя куча примеров кода для множества языков. Для каждого языка реализована своя обертка стандартных функций библиотеки FTD2XX.dll (или FTD2XX_NET.dll в случаи .NET), в которой содержатся все необходимые для работы с мостом функции. Поэтому сам код приводить не буду, а лучше расскажу общие принципы.
После установки драйверов необходимо добавить в свой проект библиотеку FTD2XX.dll/FTD2XX_NET.dll.
Подключение
Подключение к мосту организуется по следующему алгоритму:
- Запрашиваем количество подключенных к системе мостов FTDI.
- Если мосты обнаружены, то подключаемся к нужному, указав его индекс, серийный номер или описание.
- Настраиваем параметры подключения.
Просто и неинтересно — придется каждый раз вручную подключаться, хотя в некоторых случаях это приемлемо. Но почему бы не автоматизировать этот процесс? Есть два способа:
Использовать таймер — по срабатыванию запрашиваем количество подключенных мостов, если >0 и среди них есть нужный, то останавливаем таймер и подключаемся к нему. Аналогично можно отслеживать отключение, но это будет бессмысленной тратой ресурсов, так как следующий способ справляется с этой задачей гораздо лучше.
Обрабатывать сообщение WM_DEVICECHANGE — при изменении конфигурации ПК Windows генерирует это сообщение, вот и вот отличные примеры реализации его перехвата. В поле dbch_devicetype
структуры DEV_BROADCAST_HDR
содержится тип устройства, а в поле dbcc_name
структуры DEV_BROADCAST_DEVICEINTERFACE
его VID и PID. Если эти параметры соответствую параметрам нашего моста FTDI, то в программе смело можно реагировать на событие.
Обмен данными
С отправкой данных все просто, одна функция осуществляет запись в буфер микросхемы. А вот для чтения необходимо сначала узнать количество доступных байт, а уже потом считывать их из буфера. При постоянном обмене данными имеет смысл считывание осуществлять по срабатыванию таймера. Но следует учесть, что при большом объеме передаваемой информации считывание, обработку данных и работу интерфейса следует разнести по разным потокам. Особенно это актуально для реализации на .NET языках. В моей практике был случай, когда обмене со скоростью выше 16 Кбит/с однопоточное приложение реализованное на С#, начинало непонятным образом терять данные (примерно раз в 20 секунд последние 20-40 байт заполнялись нулями), считанные из буфера, тогда как полностью аналогичное, но реализованное в Delphi прекрасно справлялось с дополнительной обработкой и отображением графика на скорости 32 Кбит/с.
Отключение
При закрытии программы следует вызвать функции отключения от моста, иначе могут возникнуть баги, при которых придется потом перезагружать его вручную.
Заключение
Превосходное описание и огромное количество примеров на различных языках делают упрощают разработку до неприличия :) Да и цена 210 — 360 рублей за микросхему не такая уж и высокая, особенно учитывая перечисленные ранее плюсы.