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

Posted

技术标签:

【中文标题】如何最正确地使用 libusb 与连接的 USB 设备通信?【英文标题】:How to most properly use libusb to talk to connected USB devices? 【发布时间】:2013-06-18 20:09:49 【问题描述】:

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

具体来说,如何将数据传输到 USB 设备、从设备接收信息、找出连接设备的名称、是否有存储空间等。

更具体地说,我将在 Mac OS X 机器上运行它,所以我知道我不能只使用 Windows 头文件。

如果对 libusb 和 USB 设备有很好的解释,那也会很有帮助。

【问题讨论】:

【参考方案1】:

Here 是关于类似问题的帖子,可能对您有用。我包含很多链接。

但也许你更愿意在这里看到它。所以在这种情况下,就这样吧!

Libusb 允许您枚举设备并根据特定的供应商/产品 ID (V/P Id) 选择您想要的设备。如果您不知道这一点,并且在网上找不到产品说明,那么您可以轻松找到它。

如果它不在线,您将需要在 Linux 上使用类似于 lsusb 的应用程序。 (我不相信它在 Mac 上。)当您运行 lsusb 时,它会列出连接的设备及其 V/P Id。您可以通过拔出、运行 lsusb 并重新插入设备并进行比较来轻松找到您的设备。很简单的。 Mac 上的任何 USB 列表应用都有望像 lsusb 一样显示 V/P ID。

然后,一旦您有了这个 V/P ID,您将使用 libusb(如果使用 0.1)枚举所有设备并找到与该 ID 匹配的设备。 (我支持使用 libusbx,它恰好有一个基于 V/P id 的查找设备功能 - 事实上,libusbx 更加简洁。)

选择您的设备后,您将使用功能或输出报告发送数据包。这是最复杂的部分,因为您发送的数据包取决于我相信的单个设备。它是 8 个字节的数据,其中只有一个是您希望发送到 USB 设备的单个字符。 (如果您想发送 8 个字符,则必须遍历一个字符数组并为每个字符发送一个特征或输出报告。)

作为示例,请随意参考我为控制两个 LED 而编写的相当具体的终端 example。如果有帮助,那就太好了!它包含一个 libusbx 和 libusb-0.1 示例。

我希望这会有所帮助!

【讨论】:

在 Mac(与原始帖子有关)上,您可以使用system_profiler SPUSBDataType 获取供应商 ID 和产品 ID,而不是 lsusb。 我知道这已经过时了,但是如果有多个设备,你会怎么做?换句话说,假设我连接了两个相同类型和制造商的 RFID 阅读器?【参考方案2】:

您可以遵循的过程是:

    获取要使用lsusb 通信的设备的 VID、PID 尝试打开设备并读取设备描述符 如果您想要设备名称,请使用字符串描述符来获取该名称 检查是否附加了任何内核驱动程序。如果是,则将其分离并进行一些原始数据传输 再次获得响应后重新附加驱动程序。

【讨论】:

【参考方案3】:

libusb 1.0(更新和推荐的版本)的官方网站是https://libusb.info/。 API 文档位于http://api.libusb.info。单击“模块”部分以浏览不同的功能区域。源代码在https://github.com/libusb/libusb,您可以在https://github.com/libusb/libusb/tree/master/examples 看到一些工作示例。希望对您有所帮助!

@user2469202 的文章也是一个很好的基本介绍。

【讨论】:

以上是关于如何最正确地使用 libusb 与连接的 USB 设备通信?的主要内容,如果未能解决你的问题,请参考以下文章

Windows下Qt+libusb PC程序与斑马打印机使用USB通信

通过 libusb 与 USB 设备通信的蛮力方法

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

在 QT 中使用 libusb 检测 MAC 上的 USB 设备

libusb简介

libusb开发者指南