首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OSX上使用FTDI D2XX库?

如何在OSX上使用FTDI D2XX库?
EN

Stack Overflow用户
提问于 2013-11-04 22:41:25
回答 2查看 5.8K关注 0票数 1

我正试图与一个连接到EasySync USB2-H-5004-M usb到RS485转换器的USB设备进行对话,其速率为波特率3750000,但在OSX上。

我有一些在Windows上工作的c++代码,并且刚刚使它在OSX上编译(使用D2XX dylib而不是dll),但是我在某些地方遇到了通信问题,我不知道从哪里开始,以及如何解决这个问题。

我正在使用openFrameworks/c++,列出设备的方法如下所示:

代码语言:javascript
复制
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,我得到了这个输出:

代码语言:javascript
复制
[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上,我看到:

代码语言:javascript
复制
[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的情况看上去没问题:

代码语言:javascript
复制
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

通过系统信息,我得到:

代码语言:javascript
复制
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 (pdf链接)上的指示安装了FTDI OSX安装指南驱动程序,但是我不确定我遗漏了什么/做错了什么。

如何使用FTDI D2XX库正确地与设备通信?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-11 23:00:09

为了充实我的评论,因为它似乎回答了这里的核心问题:MacOS10.9(小牛)现在附带了一个内核扩展,其功能就像FTDI的VCP驱动程序一样。它为它检测到的FTDI USB到串行设备创建一个虚拟通信端口,这意味着如果您以前需要它,就不再需要安装VCP驱动程序了。

然而,这在它破坏了使用FTDI的D2XX库的任何应用程序中有一个不幸的副作用。这显示了D2XX函数连接到FTDI设备的失败,尽管他们可以看到它。作为一种解决方法,您可以手动卸载kext:

代码语言:javascript
复制
sudo kextunload -b com.apple.driver.AppleUSBFTDI

但它将在下一次启动时重新加载自己。

作为一种更永久的解决方案,我的应用程序一直在让我的应用程序检测这个kext是否被加载(尝试通过D2XX函数连接并查看它们是否失败),以及使用更传统的open()等调用连接到串口作为后盾。

不过,我不确定他们使用的VCP风格的kext在波特率方面是否与D2XX one一样灵活。

票数 9
EN

Stack Overflow用户

发布于 2018-10-26 18:18:42

正如Brad在回答中提到的,您需要卸载Apple kext,D2XX库才能在MacOS的后期版本上工作。但是,FTDI有一个自动为您执行此操作的脚本,名为D2XX Helper,链接到D2XX驱动程序页面上Mac行下的注释框中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19778678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档