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:
- 第 10 行:将
#include <ftdi.h>
更改为 #include "ftdi.h"
- 第 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 设备上自动连接。
我正在使用 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:
- 第 10 行:将
#include <ftdi.h>
更改为#include "ftdi.h"
- 第 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 设备上自动连接。