Не удалось открыть соединение с устройством FTDI

Я работаю над небольшим приложением OS X, которое подключается к устройству FTDI. Я настроил свой проект в соответствии с ответом в этот вопрос (я добавил файл .dylib в качестве основы и добавил в свой проект файлы ftd2xx.h, WinTypes.h и ftd2xx.cfg).

В настоящее время я могу определить, подключено ли устройство FTDI через USB:

DWORD deviceCount = 0;
FT_STATUS ftdiPortStatus = FT_ListDevices(&deviceCount, NULL, FT_LIST_NUMBER_ONLY)
if (ftdiPortStatus == FT_OK) {
    // The debugger tells me the deviceCount is now 1
    ...
}

Однако если я попытаюсь установить соединение с устройством, используя любой из следующих способов:

ftdiPortStatus = FT_OpenEx("FT232R USB UART",FT_OPEN_BY_DESCRIPTION,deviceHandle);
// OR
ftdiPortStatus = FT_Open(0, deviceHandle);

возвращаемый ftdiPortStatus всегда равен 3 (FT_DEVICE_NOT_OPENED).

Ответ здесь указывает, что проблема может заключаться в новом драйвере, который Apple добавила в OSX 10.9, однако, если я попытаюсь выгрузить этот kext:

sudo kextunload -b com.apple.driver.AppleUSBFTDI

ОС указывает, что такой kext не найден. У меня OSX 10.10, так что, возможно, Apple раскаялась в своих действиях и удалила этот драйвер из Yosemite (?). В любом случае, я все еще не могу подключиться ... Кто-нибудь знает, что может мешать подключению или иметь идеи о том, как я могу отследить проблему (возвращенный FT_STATUS не очень полезен...)?


ОБНОВЛЕНИЕ:
Ответ ниже решил проблему для меня. Если вы не уверены, может быть, у вас установлен второй драйвер VCP, не принадлежащий Apple, вы можете найти другие драйверы, выполнив следующую команду в терминале:

kextstat | grep FTDI

который выведет что-то вроде этого:

  154    0 0xffffff7f831ee000 0x8000     0x8000     com.FTDI.driver.FTDIUSBSerialDriver (2.2.18) <96 16 5 4 3 1>
  155    0 0xffffff7f831f6000 0x7000     0x7000     com.apple.driver.AppleUSBFTDI (1.0.1b12) <96 16 5 4 3>

person Troy    schedule 11.02.2015    source источник


Ответы (1)


Нет, этот водитель все еще там, в Йосемити. Бег

sudo kextunload -b com.apple.driver.AppleUSBFTDI

по-прежнему удаляет соответствующий kext и освобождает устройство для доступа через библиотеку D2XX в этой системе Yosemite, которую я только что протестировал. Кекст может отсутствовать, если вы еще не подключили свое устройство FTDI к системе.

Он также может быть заблокирован другим драйвером виртуального порта связи. Если вы установили драйвер виртуального порта связи FTDI, он также возьмет на себя управление портом и заблокирует подключение библиотеки D2XX. Некоторые комплекты разработчика Arduino также используют драйверы виртуального порта связи для микросхем FTDI, которые они используют, поэтому они могут установить свой собственный драйвер. Проверьте это.

Наконец, имя устройства «FT232R USB UART», которое я использую в своем примере кода, может не совпадать с именем вашего устройства. Существует много вариантов FTDI, и вам нужно убедиться, что вы используете имя вашего конкретного типа устройства. Это можно получить с помощью команды FT_ListDevices() с параметрами FT_LIST_BY_INDEX|FT_OPEN_BY_DESCRIPTION. Если вы используете неправильное имя устройства, FT_OpenEx() может завершиться ошибкой.

person Brad Larson    schedule 11.02.2015
comment
Спасибо за ответ, Брэд. Что касается имени устройства, я использую ту же проверку, что и в вашем примере (и другая функция Open() тоже не работает), поэтому я предполагаю, что где-то еще должен быть конфликт. Я вспомнил, что установил файл .dylib в каталог /user/local/lib/ (согласно инструкции FTDI ReadMe), поэтому удалил его оттуда, но теперь приложение вылетает после запуска, потому что оно, видимо, хочет lib находиться в этом месте. Нужно ли мне также размещать его там, или достаточно просто указать Xcode на .dylib в моем проекте? - person Troy; 11.02.2015
comment
Что касается dylib, я считаю, что у меня просто общая проблема со ссылками, которую я исследую. Мне любопытно, как вы решаете проблему com.apple.driver.AppleUSBFTDI в производстве. Просить (не технически подкованных) клиентов удалить kext, когда они используют приложение, кажется не очень практичным ... Или вы лично просто используете библиотеку FTDI для внутренних приложений? - person Troy; 11.02.2015
comment
@Troy - Мы создали наш кекст, который абсолютно пуст, но заявляет о праве собственности на устройства FTDI, которые мы используем. Мы подписываем это как драйвер и развертываем его как устанавливаемый пакет, который мы запускаем один раз на новых системах, которые мы поставляем, или который наши клиенты запускают один раз на своих системах при обновлении до Mavericks / Yosemite. Что касается .dylib, см. третий и четвертый абзацы в моем ответе: stackoverflow.com/a/14446874/19679. Его необходимо собрать в нужном месте и изменить пути установки. - person Brad Larson; 12.02.2015
comment
Мы по-прежнему используем интерфейс D2XX, потому что у виртуального коммуникационного порта Apple есть проблемы с задержкой, а библиотека FTDI D2XX позволяет уменьшить задержку с помощью команды. Для нашего приложения задержка по умолчанию делает связь непригодной для использования, поэтому мы должны продолжать использовать библиотеку D2XX. Если не считать необходимости устанавливать наш поддельный драйвер один раз, он отлично работает. - person Brad Larson; 12.02.2015
comment
Итак, просто чтобы убедиться, что я понимаю... вы создали драйвер отдельно от своего приложения, который ничего не делает, кроме как утверждает право собственности на ваше устройство. И, просто установив этот драйвер, он не позволит драйверу Apple перехватить соединение с вашим устройством? Затем, когда вы устанавливаете свое приложение/пользовательский интерфейс, оно может установить соединение напрямую (т.е. без использования установленного драйвера)? - person Troy; 12.02.2015
comment
@ Трой - Да. Это отдельный пакет от нашего приложения, который нужно установить только один раз. Для этого вам потребуется специальное разрешение Apple (ваш стандартный сертификат ID разработчика должен быть одобрен ими для подписи драйверов), но у них есть шаблон для пустых драйверов, подобных этому. После установки драйвера Apple FTDI не будет требовать устройства, и вы сможете получить к ним доступ через библиотеку D2XX, как это было до Mavericks. - person Brad Larson; 12.02.2015
comment
Давайте продолжим обсуждение в чате. - person Troy; 12.02.2015