Как использовать библиотеку FTDI D2XX на OSX?

Я пытаюсь подключиться к USB-устройству, подключенному к EasySync USB2-H-5004-M, конвертеру USB в RS485 со скоростью передачи данных 3750000, но на OSX.

У меня есть некоторый код на C ++, работающий на Windows, и мне только что удалось заставить его скомпилировать на OSX (используя dylib D2XX вместо dll), но у меня есть проблема с коммуникацией где-то, и я не уверен, с чего начать и как решить это.

Я использую openFrameworks / c ++ и метод для перечисления устройств выглядит следующим образом:

int FTDI::enumerateDevices(){
DWORD numDevs;
FT_STATUS ftStatus = FT_CreateDeviceInfoList(&numDevs);
numPortsFound = 0;

if (ftStatus == FT_OK) {
ofLog(OF_LOG_NOTICE, "Number of FTDI devices is %d",numDevs);
devicesList = (FT_DEVICE_LIST_INFO_NODE*)malloc(sizeof(FT_DEVICE_LIST_INFO_NODE)*numDevs);
ftStatus = FT_GetDeviceInfoList(devicesList, &numDevs);
if (ftStatus == FT_OK) {
printf("\n");
for (int i = 0; i < numDevs; i++) {
ofLog(OF_LOG_VERBOSE, "Dev %d:",i);
ofLog(OF_LOG_VERBOSE, " Flags=0x%x",devicesList[i].Flags);
ofLog(OF_LOG_VERBOSE, " Type=0x%x",devicesList[i].Type);
ofLog(OF_LOG_VERBOSE, " ID=0x%x",devicesList[i].ID);
ofLog(OF_LOG_VERBOSE, " LocId=0x%x",devicesList[i].LocId);
ofLog(OF_LOG_VERBOSE, " SerialNumber=%s",devicesList[i].SerialNumber);
ofLog(OF_LOG_VERBOSE, " Description=%s",devicesList[i].Description);
ofLog(OF_LOG_VERBOSE, " ftHandle=0x%x\n",devicesList[i].ftHandle);
}
numPortsFound = numDevs;
} else {
ofLog(OF_LOG_ERROR, "FTD2XX::FT_GetDeviceInfoList() failed");
}
} else {
ofLog(OF_LOG_ERROR, "FTD2XX::FT_CreateDeviceInfoList() failed");
}

return numPortsFound;

}

Проблема в OSX, я получаю этот вывод:

[notice ] Number of FTDI devices is 4

[verbose] Dev 0:
[verbose]  Flags=0x1
[verbose]  Type=0x3
[verbose]  ID=0x0
[verbose]  LocId=0x0
[verbose]  SerialNumber=
[verbose]  Description=
[verbose]  ftHandle=0x0

[verbose] Dev 1:
[verbose]  Flags=0x1
[verbose]  Type=0x3
[verbose]  ID=0x0
[verbose]  LocId=0x0
[verbose]  SerialNumber=
[verbose]  Description=
[verbose]  ftHandle=0x0

[verbose] Dev 2:
[verbose]  Flags=0x1
[verbose]  Type=0x3
[verbose]  ID=0x0
[verbose]  LocId=0x0
[verbose]  SerialNumber=
[verbose]  Description=
[verbose]  ftHandle=0x0

[verbose] Dev 3:
[verbose]  Flags=0x1
[verbose]  Type=0x3
[verbose]  ID=0x0
[verbose]  LocId=0x0
[verbose]  SerialNumber=
[verbose]  Description=
[verbose]  ftHandle=0x0

[ error ] failed to register FTDI device with serial FTWVZVEBA in internal register
[ error ] error opening port with serial: FTWVZVEBA

который не выглядит правильным. Например, в Windows, на порт A / канал 1 / индекс устройства 0 я вижу это:

[verbose] Dev 0:
[verbose]  Flags=0x2
[verbose]  Type=0x7
[verbose]  ID=0x4036011
[verbose]  LocId=0x02111
[verbose]  SerialNumber=FTWVZVEBA
[verbose]  Description=USB2-H-5004-M A
[verbose]  ftHandle=0x0

После быстрого просмотра в / dev все выглядит хорошо:

ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port    /dev/tty.usbserial-FTWVZVEBB
/dev/tty.Bluetooth-Modem        /dev/tty.usbserial-FTWVZVEBC
/dev/tty.usbmodemfa131          /dev/tty.usbserial-FTWVZVEBD

и через Системную информацию я получаю:

USB2-H-5004-M:

Product ID:   0x6011
Vendor ID:    0x0403  (Future Technology Devices International Limited)
Version:   8.00
Serial Number:    FTWVZVEB
Speed:    Up to 480 Mb/sec
Manufacturer: FTDI
Location ID:  0xfd120000 / 4
Current Available (mA):   500
Current Required (mA):    200

Я установил драйвер D2XX в соответствии с инструкциями на FTDI OSX Руководство по установке (PDF-ссылка), но я не уверен, что я скучаю / делаю неправильно.

Как правильно подключиться к устройству с помощью библиотеки FTDI D2XX?

1

Решение

Чтобы конкретизировать мой комментарий, поскольку он, кажется, ответил на основной вопрос здесь: Mac OS 10.9 (Mavericks) теперь поставляется с расширением ядра, которое действует как драйверы VCP FTDI. Он создает виртуальный коммуникационный порт для устройств FTDI USB-to-serial, которые он обнаруживает, и означает, что вам больше не нужно устанавливать драйвер VCP, если он вам был необходим раньше.

Это имеет неблагоприятный побочный эффект, однако, в том, что он ломает любое приложение, использующее библиотеку FTDI D2XX. Это проявляется в том, что функции D2XX не могут подключиться к устройству FTDI, даже если они это видят. В качестве обходного пути вы можете вручную выгрузить kext:

sudo kextunload -b com.apple.driver.AppleUSBFTDI

но он перезагрузится при следующей загрузке.

Как более постоянное решение, мои приложения определяют, загружен ли этот kext (пытаясь подключиться через функции D2XX и проверяя, не работают ли они), и используя более традиционные open()и т. д. требует подключения к последовательному порту в качестве запасного варианта.

Я не уверен, что используемый ими VCP-стиль kext обеспечивает такую ​​же гибкость с точки зрения скорости передачи данных, как D2XX.

9

Другие решения

Как упомянуто в ответе Брэда Ларсона, вам нужно выгрузить kext Apple FTDI, чтобы библиотека D2XX работала на более поздних версиях MacOS. Однако у FTDI есть скрипт, который автоматически делает это для вас, который называется D2XX Helper, связанный с полем Комментарии под строкой Mac OS X на Страница драйверов D2XX.

0

По вопросам рекламы [email protected]