如何使用 libusb 和 libusb_get_device_descriptor()?

     2023-04-17     159

关键词:

【中文标题】如何使用 libusb 和 libusb_get_device_descriptor()?【英文标题】:How to use libusb and libusb_get_device_descriptor()? 【发布时间】:2013-01-21 05:43:51 【问题描述】:

我正在学习第一次在 Ubuntu 12.10 上使用 libusb v1.0.0。这是我用来尝试了解如何使用此 API 的一些小测试代码:

#include <libusb-1.0/libusb.h>
...
libusb_device **list;
libusb_get_device_list(ctx, &list); // Returns 11 USB devices which is correct.
for (size_t idx = 0; list[idx] != NULL; idx ++)

    libusb_device *dev = list[idx];
    libusb_device_descriptor desc = 0;
    int rc = libusb_get_device_descriptor(dev, &desc);

此时,rc == 0,意味着它应该已经成功完成了。来源:documentation for *libusb_get_device_descriptor()*。

但结构 desc 始终为空。没有一个字段被设置。如果我将上面的最后两行更改为:

    libusb_device_descriptor desc = 1, 2, 3, 4, 5, 6, 7, 8, 9;
    int rc = libusb_get_device_descriptor(dev, &desc);

...然后当libusb_get_device_descriptor() 返回时,我看到desc 保持不变,确认我没有从这个 API 中得到我期望的结果。

我还尝试以 root 身份运行 a.out,以防万一这需要提升权限。在 libusb_get_device_descriptor 上进行谷歌搜索并没有让我得到任何结果。

我运行的相关命令来尝试这段代码:

sudo apt-get install libusb-1.0.0-dev
g++ -ggdb test.cpp -lusb-1.0
./a.out 

啊!疯狂的用户错误! sharth 的代码帮我弄清楚了。这是我实际使用的代码——看看你是否能发现错误:

std::cout << "rc == " << libusb_get_device_descriptor(dev, &desc) << std::endl
          << "vendor == " << desc.idVendor << std::endl;

我猜编译器评估这个的方式,在实际调用libusb_get_device_descriptor() 之前评估desc.idVendor 是免费的。我的错。

【问题讨论】:

Your cout was actually undefined behavior. 很高兴为您提供帮助! 【参考方案1】:

您没有包含完整的、可编译的测试用例。所以我建了一个。这适用于我在 CentOS 6 x64 上。我也以普通用户帐户的身份运行它。

来源

#include <cassert>
#include <cstdio>
#include <libusb-1.0/libusb.h>

int main() 
    libusb_context *context = NULL;
    libusb_device **list = NULL;
    int rc = 0;
    ssize_t count = 0;

    rc = libusb_init(&context);
    assert(rc == 0);

    count = libusb_get_device_list(context, &list);
    assert(count > 0);

    for (size_t idx = 0; idx < count; ++idx) 
        libusb_device *device = list[idx];
        libusb_device_descriptor desc = 0;

        rc = libusb_get_device_descriptor(device, &desc);
        assert(rc == 0);

        printf("Vendor:Device = %04x:%04x\n", desc.idVendor, desc.idProduct);
    

    libusb_free_device_list(list, count);
    libusb_exit(context);

输出

Vendor:Device = 1d6b:0002
Vendor:Device = 1d6b:0002
Vendor:Device = 8087:0020
Vendor:Device = 8087:0020
Vendor:Device = 0424:2514
Vendor:Device = 10c4:ea60
Vendor:Device = 051d:0002
Vendor:Device = 0624:0248

【讨论】:

@Yeti:当然。以后您可以随意进行类似的编辑。 libusb_free_device_list(list, count); void libusb_free_device_list(libusb_device **list, int unref_devices) 释放 libusb_get_device_list 发现的设备列表。如果 unref_device 设置为 1,则列表中的所有设备的引用计数器都会减一。你有 unref_devices 错误【参考方案2】:

这不是一个独立的答案,它更像是对比尔林奇帖子的评论。我无法在 Bill Lynch 的帖子中添加评论(缺少声誉),所以我决定这样做 ;-)。

上面的代码中缺少一点细节:

您必须手动释放从 libusb_get_device_list 中填写的列表。

来自libusb docu:

您应该在使用完所有设备后取消对它们的引用,然后使用 libusb_free_device_list() 释放列表。请注意, libusb_free_device_list() 可以为您取消引用所有设备。请注意不要取消引用您将要打开的设备,直到您打开它。

【讨论】:

【参考方案3】:

只是添加到比尔的答案中,以避免您可能会从该行收到的多个警告

libusb_device_descriptor desc = 0;

只需删除作业。

libusb_device_descriptor desc;

没什么大不了的,但这些事情让我很困扰。

【讨论】:

Libusb 以及如何在 Ubuntu 中使用它的包

】Libusb以及如何在Ubuntu中使用它的包【英文标题】:LibusbandhowtouseitspackagesinUbuntu【发布时间】:2013-02-0901:58:09【问题描述】:我已经使用以下命令安装了libusb。我不确定它是否正确,命令是sudoapt-getinstalllibusb-dev一旦我安装了(... 查看详情

如何最正确地使用 libusb 与连接的 USB 设备通信?

】如何最正确地使用libusb与连接的USB设备通信?【英文标题】:HowtomostproperlyuselibusbtotalktoconnectedUSBdevices?【发布时间】:2013-06-1820:09:49【问题描述】:如何最恰当地使用libusb与连接的USB设备通信?具体来说,如何将数据传输到USB... 查看详情

linux下使用c语言和libusb开发usbhid

玩转USB系列:Linux下使用C语言和libusb开发USBHID实验环境开发步骤安装libusb试试好用否我们来与HID设备通讯!探索、学习与注意:1.&ctx是个什么鬼2.print_devs(devs)->print_devs(&devs);3.操作端口这类程序加上sudo!4.libusb_interrupt_tran... 查看详情

Windows 8.1 上的 Pyusb - 没有可用的后端 - 如何安装 libusb?

】Windows8.1上的Pyusb-没有可用的后端-如何安装libusb?【英文标题】:Pyusbonwindows8.1-nobackendavailable-howtoinstalllibusb?【发布时间】:2016-03-0212:39:07【问题描述】:使用pyinstaller3.1、python2.7.9和tkinter。尝试使用pyusb代替pyserial,但没有可... 查看详情

windows下qt+libusbpc程序与斑马打印机使用usb通信(代码片段)

Qt没有USB类,所以这里我决定使用第三方库libusb。1、下载libusb,下载网址:https://sourceforge.net/projects/libusb/ 2、把下载下来libusb压缩包解压,解压后有个INSTALL_WIN.txt,关于Windows环境下编译安装。  (1)我先安装了MinGW,但... 查看详情

如何使用 libusb 在 node.js 中将数据发送到 USB 设备

】如何使用libusb在node.js中将数据发送到USB设备【英文标题】:HowtosenddatatoUSBdeviceinnode.jsusinglibusb【发布时间】:2014-05-0621:33:59【问题描述】:我尝试从设备(USB温度计)获取数据,遵循thisdocumentation,但没有任何结果。为了从设... 查看详情

如何在 Mac OS X 上设置 libusb?

】如何在MacOSX上设置libusb?【英文标题】:HowtosetuplibusbonMacOSX?【发布时间】:2011-04-2016:45:41【问题描述】:我想尝试在Mac上使用libusb制作用户空间设备驱动程序,但我不知道从哪里开始。在SDK安装程序(我从http://www.ellert.se/twain... 查看详情

libusb 接口已声明

...ROR_BUSY(-6)。根据文档,这意味着该设备已被认领(link)。我如何知道是哪个驱动程序/程序声明了设备,更重要的是,我如何我自己在设备被声明后声明它。代码sn-p:r 查看详情

`libusb_attach_kernel_driver` 不工作

...发布时间】:2015-09-2515:08:44【问题描述】:我在彻底关闭使用libusb的Linux应用程序时遇到问题(内核不回收接口):intrc;rc=libusb_reset_device(handle_);if(rc<0)cerr<<"Errorres 查看详情

libusb系列-001-libusb简介(代码片段)

...录libusb系列-001-libusb简介摘要基本信息简介支持平台官网如何使用下载神奇的1.0.9版本关键字:Debian、Linux、Qt、libusb、源码内容背景:最近项目终于切到Linux下开发了,所以最近的记录都是发生在Debian10以及ArmDebain10下&... 查看详情

libusb系列-004-qt下使用libusb库(代码片段)

libusb系列-004-Qt下使用libusb库文章目录libusb系列-004-Qt下使用libusb库摘要复制库到指定目录在Pro中包含库文件包含头文件多说一句关键字:Debian、Linux、Qt、libusb、源码内容背景:最近项目终于切到Linux下开发了,所以最... 查看详情

libusb使用

xxx 查看详情

libusb系列-006-qt下使用libusb1.0.9源码(代码片段)

libusb系列-006-Qt下使用libusb1.0.9源码文章目录libusb系列-006-Qt下使用libusb1.0.9源码摘要添加宏添加源文件编译文件测试libusb工程源码关键字:Debian、Linux、Qt、libusb、源码内容背景:最近项目终于切到Linux下开发了,所以最... 查看详情

LibUsb 声明接口访问被拒绝 Java

...能够从USB计步器读取数据。我在Java中尝试这个,我正在使用LibUsb和Usb4Java库。我似乎无法认领USB管道或类似的东西。我正在使用的代码:finalContextcontext=newContext();intresult=Lib 查看详情

使用 libusb 的 Windows 应用程序:由于互斥锁导致的运行时错误

】使用libusb的Windows应用程序:由于互斥锁导致的运行时错误【英文标题】:Windowsapplicationusinglibusb:runtimeerrorduetomutexlock【发布时间】:2015-06-1010:51:03【问题描述】:我正在尝试通过USB在笔记本电脑和嵌入式板之间建立通信。主板... 查看详情

如何在 Ubuntu 中安装 libusb

】如何在Ubuntu中安装libusb【英文标题】:HowtoinstalllibusbinUbuntu【发布时间】:2011-06-1817:04:52【问题描述】:我有一个C程序,在标头中有#include部分。我已将libusb-1.0.0下载到我的计算机上。如果我只是将libusb-1.0.0文件夹复制到我的C... 查看详情

libusb开发者指南

  本文档描述libusb的API,以及如何开发USB应用。1介绍1.1概览本文档描述libusb-0.1的API和USB相关内容。1.2当前OS支持Linux2.2或以上FreeBSD/NetBSD/OpenBSDDarwin/MacOSX2API2.1设备与接口一个设备可能有多个接口,所以一个句柄可以返回多... 查看详情

Ubuntu上的Libusb

...布时间】:2012-02-0509:12:46【问题描述】:我在ubuntu11:04上使用libusb制作了一个从USB设备读取数据的程序。为什么,当多个程序从usb读取数据时,只执行一个新程序激活,而其余程序不继续执行。【问题讨论】:【参考方案1】:可... 查看详情