Libftdi usb_open() 失败

Libftdi usb_open() failed

我正在使用 Iridium PTT 进行一个项目。 Iridium 硬件连接到卫星,然后通过 USB 连接到我的 PC。

Iridium 硬件附带了一些 运行 在 Ubuntu Linux 上的软件,运行 在我的 PC 上的 Virtual Box 中。该软件全部用 C 编写,运行 在 Ubuntu 中非常好。但我想使用 Visual Studios 在 Windows 上进行开发。

Ubuntu 版本使用 libftdi 和 libusb(来自 intra2net)与硬件通信。

我们在 Visual Studios 2013 Desktop Express Edition 中获取了 libftdi、libusb 并创建了一个项目。 (我什至为 Windows 下载了 Zadig 来检查以确保我有正确的 USB 驱动程序。我验证了驱动程序的箭头是绿色的,因为我的 USB 连接到硬件。)

当 Iridium 硬件连接到计算机时,设备管理器中会出现四个串行端口。当我 运行 我的程序时,我试图从 Windows 打开其中一个串行端口。当我尝试打开一个时出现错误(即使我可以在同一台 PC 上的虚拟框中从 Ubuntu、运行ning 轻松打开它)。

我正在使用一些名为 "simple.c" 的示例代码(来自 Intra2net),我在 Visual Studios 中 运行ning。我已将其发布在下方:

/* simple.c

Simple libftdi usage example

This program is distributed under the GPL, version 2
*/

#include <stdio.h>
#include <stdlib.h>
#include "ftdi.h"

int main(void)
{
    int ret;
    struct ftdi_context *ftdi;
    struct ftdi_version_info version;
    if ((ftdi = ftdi_new()) == 0)
    {
        fprintf(stderr, "ftdi_new failed\n");
        return EXIT_FAILURE;
    }

    version = ftdi_get_library_version();
    printf("Initialized libftdi %s (major: %d, minor: %d, micro: %d, snapshot ver: %s)\n",
        version.version_str, version.major, version.minor, version.micro,
        version.snapshot_str);

    if ((ret = ftdi_usb_open(ftdi, 0x403, 0x6011)) < 0)
    {
        fprintf(stderr, "unable to open ftdi device: %d (%s)\n", ret, ftdi_get_error_string(ftdi));
        ftdi_free(ftdi);
        return EXIT_FAILURE;
    }

    // Read out FTDIChip-ID of R type chips
    if (ftdi->type == TYPE_R)
    {
        unsigned int chipid;
        printf("ftdi_read_chipid: %d\n", ftdi_read_chipid(ftdi, &chipid));
        printf("FTDI chipid: %X\n", chipid);
    }

    if ((ret = ftdi_usb_close(ftdi)) < 0)
    {
        fprintf(stderr, "unable to close ftdi device: %d (%s)\n", ret, ftdi_get_error_string(ftdi));
        ftdi_free(ftdi);
        return EXIT_FAILURE;
    }

    ftdi_free(ftdi);

    return EXIT_SUCCESS;
}

我只修改了 Intra2net 原文的两行 simple.c:

  1. 第 10 行:将 #include <ftdi.h> 更改为 #include "ftdi.h"
  2. 第 28 行:我将 if ((ret = ftdi_usb_open(ftdi, 0x403, 0x6011)) < 0) 中的原始十六进制数字更改为 Ubuntu C 代码中使用的数字,用于我的硬件。

我在 运行 simple.c 时得到的错误是 unable to open ftdi device: -4 (usb_open() failed) 这发生在 ftdi_usb_open 函数的第 28 行。

我是低级 C 编程的新手,我不知道从这里到哪里去。
当我遇到这个问题时,这意味着什么?我该如何解决这个问题? 谢谢!

您对 ftdi_usb_open(ftdi_context, vendor, product) 的调用将打开具有给定供应商和产品 ID 的第一台设备。

假设您提供了正确的供应商和产品值,您的代码看起来没有任何问题。

如果您无法打开设备,一些值得检查的事项:

  • Windows 可以在自动插头上做一些奇怪的事情。尝试禁用 COM 端口上的串行枚举器。您可以在设备管理器->端口设置->高级设置中访问此选项。
  • 在相同的高级设置中,删除 Enable Model Ctrl At Startup。在 USB 上的拔出-重新插入循环后,监视这些信号的设备可能会进入错误状态。 More on this 来自 ftdi 芯片供应商。
  • 另一个程序先于您占用了芯片的接口。您可能有一些东西 运行 可以在 USB 设备上自动连接。