无法打开与 FTDI 设备的连接
Unable to open a connection to an FTDI device
我正在开发一个连接到 FTDI 设备的小型 OS X 应用程序。我已经根据 this question 中的答案配置了我的项目(我添加了 .dylib 文件作为框架,并且添加了 ftd2xx.h、WinTypes.h 和 ftd2xx.cfg 文件到我的项目)。
我目前能够检测到 if/when 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)。
答案here表明问题可能是Apple在OSX 10.9中添加的新驱动程序,但是,如果我尝试卸载该kext:
sudo kextunload -b com.apple.driver.AppleUSBFTDI
OS表示没有找到这样的kext。我在 OSX 10.10,所以也许 Apple 后悔了他们的方式并从 Yosemite(?)知道是什么阻止了连接,或者对我如何追踪问题有想法(返回的 FT_STATUS 不是很有帮助...)?
更新:
下面的答案为我解决了这个问题。如果您不确定是否安装了第二个非 Apple VCP 驱动程序,您可以通过 运行 在终端中执行以下命令找到其他驱动程序:
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>
不,driver 在 Yosemite 上仍然存在。 运行
sudo kextunload -b com.apple.driver.AppleUSBFTDI
仍然删除相关的 kext 并释放设备以通过我刚刚测试的这个 Yosemite 系统上的 D2XX 库进行访问。如果您尚未将 FTDI 设备连接到系统,则可能缺少 kext。
它也可能被另一个虚拟通信端口阻塞 driver。如果您已经安装了 FTDI 的虚拟通信端口 driver,那也将控制该端口并阻止 D2XX 库连接。某些 Arduino 开发套件还为他们使用的 FTDI 芯片使用虚拟通信端口 driver,因此他们可能已经安装了自己的 driver。检查一下。
最后,我在示例代码中使用的设备名称"FT232R USB UART"可能不是您设备的名称。有许多 FTDI 变体,您需要确保使用的是特定类型设备的名称。这可以从带有 FT_LIST_BY_INDEX|FT_OPEN_BY_DESCRIPTION
选项的 FT_ListDevices()
命令中获得。如果您使用错误的设备名称,FT_OpenEx()
可能会失败。
我正在开发一个连接到 FTDI 设备的小型 OS X 应用程序。我已经根据 this question 中的答案配置了我的项目(我添加了 .dylib 文件作为框架,并且添加了 ftd2xx.h、WinTypes.h 和 ftd2xx.cfg 文件到我的项目)。
我目前能够检测到 if/when 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)。
答案here表明问题可能是Apple在OSX 10.9中添加的新驱动程序,但是,如果我尝试卸载该kext:
sudo kextunload -b com.apple.driver.AppleUSBFTDI
OS表示没有找到这样的kext。我在 OSX 10.10,所以也许 Apple 后悔了他们的方式并从 Yosemite(?)知道是什么阻止了连接,或者对我如何追踪问题有想法(返回的 FT_STATUS 不是很有帮助...)?
更新:
下面的答案为我解决了这个问题。如果您不确定是否安装了第二个非 Apple VCP 驱动程序,您可以通过 运行 在终端中执行以下命令找到其他驱动程序:
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>
不,driver 在 Yosemite 上仍然存在。 运行
sudo kextunload -b com.apple.driver.AppleUSBFTDI
仍然删除相关的 kext 并释放设备以通过我刚刚测试的这个 Yosemite 系统上的 D2XX 库进行访问。如果您尚未将 FTDI 设备连接到系统,则可能缺少 kext。
它也可能被另一个虚拟通信端口阻塞 driver。如果您已经安装了 FTDI 的虚拟通信端口 driver,那也将控制该端口并阻止 D2XX 库连接。某些 Arduino 开发套件还为他们使用的 FTDI 芯片使用虚拟通信端口 driver,因此他们可能已经安装了自己的 driver。检查一下。
最后,我在示例代码中使用的设备名称"FT232R USB UART"可能不是您设备的名称。有许多 FTDI 变体,您需要确保使用的是特定类型设备的名称。这可以从带有 FT_LIST_BY_INDEX|FT_OPEN_BY_DESCRIPTION
选项的 FT_ListDevices()
命令中获得。如果您使用错误的设备名称,FT_OpenEx()
可能会失败。