我正在尝试以波特率 2-H-5004-M USB 到 RS485 转换器连接到 EasySync USB3750000 但在 OSX 上的 USB 设备通信。
我有一些 c++ 代码在 Windows 上运行,并且刚刚设法让它在 OSX 上编译(使用 D2XX dylib 而不是 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%xn",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
我已经按照FTDI OSX安装指南(pdf链接)中的说明安装了D2XX驱动程序,但我不确定我错过了什么/做错了什么。
如何使用 FTDI D2XX 库与设备正确通信?
我的评论,因为它似乎已经回答了这里的核心问题:Mac OS 10.9(Mavericks)现在附带了一个内核扩展,其行为类似于FTDI的VCP驱动程序。它为检测到的 FTDI USB 到串行设备创建一个虚拟通信端口,这意味着如果您以前需要 VCP 驱动程序,则不再需要安装 VCP 驱动程序。
但是,这有一个不幸的副作用,因为它会破坏任何使用FTDI的D2XX库的应用程序。这表现为 D2XX 函数无法连接到 FTDI 设备,即使它们可以看到它。作为解决方法,您可以手动卸载 kext:
sudo kextunload -b com.apple.driver.AppleUSBFTDI
但它会在下次启动时重新加载。
作为一个更持久的解决方案,我一直让我的应用程序检测这个 kext 是否已加载(通过尝试通过 D2XX 函数连接并查看它们是否失败),并使用更传统的open()
等调用连接到串行端口作为回退。
不过,我不确定他们使用的 VCP 风格的 kext 是否在波特率方面具有与 D2XX 一样大的灵活性。
正如Brad Larson的回答中提到的,你需要卸载Apple FTDI kext,D2XX库才能在更高版本的MacOS上工作。但是,FTDI 有一个自动为您执行此操作的脚本,称为 D2XX 帮助程序,链接到 D2XX 驱动程序页面上 Mac OS X 行下的"注释"框中。