【问题标题】:Libftdi usb_open() failedLibftdi usb_open() 失败
【发布时间】:2015-08-07 18:05:25
【问题描述】:

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

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

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

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

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

我正在使用在 Visual Studios 中运行的一些名为“simple.c”的示例代码(来自 Intra2net)。我把它贴在下面:

/* 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 &lt;ftdi.h&gt; 更改为 #include "ftdi.h"
  2. 第 28 行:对于我的硬件,我将 if ((ret = ftdi_usb_open(ftdi, 0x403, 0x6011)) &lt; 0) 中的原始十六进制数字更改为 Ubuntu C 代码中使用的数字。

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

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

【问题讨论】:

    标签: c libusb


    【解决方案1】:

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

    假设您提供正确的供应商和产品价值,您的代码中没有任何错误。

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

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

    【讨论】:

    • 感谢发布。我没想过要检查这些东西。我做了前两个项目,结果仍然和以前一样。 (我不太确定如何检查是否有其他程序正在使用芯片的接口。所以我重新启动计算机并只运行 Visual Studios。但结果仍然相同。)
    • 您可以尝试使用封闭源代码 [ftdichip.com/Drivers/D2XX.htm](FTDI 驱动程序)。 API 基本相同,名称略有不同。还要确保 USB 端口不仅对您的 VM 可用。
    • 是的,你是对的,我应该使用 FTDI 的驱动程序。我的一个朋友甚至告诉我不可能在 Windows 上运行 libftdi、libusb(它只适用于 Linux)。通过阅读“如何确定设备是否基于 FTDI?”,我确认我的 Windows 8 PC 正在使用 FTDI 驱动程序。来自codeproject.com/Articles/37982/Interact-with-FTDI-chip 是的,我走错了兔子洞!再次感谢大家的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多