【问题标题】:Discovering and communicating with USB devices in C++在 C++ 中发现 USB 设备并与之通信
【发布时间】:2016-05-24 18:01:04
【问题描述】:

为了直截了当地记录,在 USB 通信方面,我完全是新手。虽然我在微控制器端处理过较低级别的串行通信(SPI、UART、I2C),但我从未处理过 USB 或串行通信的操作系统端。所以请多多包涵。

我有一个 RFID 读取器/写入器,它有自己的协议,我用它来发出各种命令。我正在研究使用 Boost:ASIO 库来执行我需要的读/写操作。

但是,图书馆有点超出我的想象,我正在寻求一些指导。此外,当我在 Windows 环境中工作时,我想让我的硬件抽象层尽可能地可移植。同样,我过去在(其他程序员)对 COM 端口进行硬编码方面有过糟糕的经历,我希望我的程序在插入时发现我的阅读器,也许是基于阅读器 ID。

【问题讨论】:

  • 你的问题是?
  • 这方面的一些方向

标签: c++ boost serial-port usb boost-asio


【解决方案1】:

我建议研究一下 libusb (http://www.libusb.org/),它具有对 USB 接口的跨平台支持,如果您了解 USB 的工作原理,它并不是那么复杂。

【讨论】:

  • 我看过它,它看起来确实很有吸引力。但是,我主要关心的是许可。我的应用程序是封闭源代码(不是我的选择,责怪众所周知的尖头老板)。所以我必须对使用开源的东西保持警惕。
  • 它是在 GNU Lesser General Public License 下获得许可的,所以只要你不静态链接到它,或者修改它的源代码,你只需在发布时包含它的许可证副本。跨度>
  • 我应该注意,密切关注静态链接部分。有些平台并没有真正让你这样做,尤其是在移动设备中。不幸的是,这具有将 LGPL 解决方案排除在外的副作用。然而,在允许的情况下,LGPL 既常见又有吸引力,因为它为您提供了一个可以研究源代码的库,但它也让您的客户知道您在代码中使用了易于理解且广受信任的库。
【解决方案2】:

设备检测是相当特定于平台的,因此您应该在特定于操作系统的部分和数据处理之间定义一个跨平台 API。

对于 Windows 上的设备枚举,有 SetupDi* API。设备到达事件可以通过RegisterDeviceNotification获取。您可以检查包含 VID 和 PID 的“兼容 ID”,以及报告 USB 字符串描述符的总线相关设备描述,以识别您自己的设备。

在 Linux 上,有udev,它能够匹配 VID、PID 和字符串描述符,并为匹配的设备提供枚举和到达事件。

一旦您使用这些特定于操作系统的方法来查找串口名称,您就有了各种跨平台的串口库来打开连接并与设备交换数据。

【讨论】:

    猜你喜欢
    • 2012-12-19
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2012-04-28
    • 2013-04-07
    • 2015-04-02
    相关资源
    最近更新 更多