【问题标题】:Need to find and open a USB serial device on linux需要在linux上找到并打开一个USB串口设备
【发布时间】:2016-11-12 02:13:20
【问题描述】:

我正在编写一个小型 C 应用程序以在我的 (Linux) QNAP NAS 上运行,该应用程序将与 Arduino 通信(我对 arduino 的任何 USB 代码都没有任何问题)。 (arduino 上有一个受信任的应用程序,可以通过 USB 串行接收文本命令。)

我希望使用 USB 供应商/产品 ID 找到它(目前只实现了一半)。到目前为止,我所拥有的(见下文)工作得非常好,因为它确实找到了设备。

// runs on NAS
#include <stdio.h>
#include <usb.h>

main () {
  struct usb_bus *bus;
  struct usb_device *dev;
  usb_init();
  usb_find_busses();
  usb_find_devices();
  for (bus = usb_busses; bus; bus = bus->next) {
    for (dev = bus->devices; dev; dev = dev->next) {
      printf("Trying %s/%s\n", bus->dirname, dev->filename);
      printf("\tVendor = 0x%04x\n", dev->descriptor.idVendor);
      printf("\tBus = 0x%03x\n", bus->location);
      printf("\tFile = %s\n", dev->filename);
      if (dev->descriptor.idVendor==0x403) {
        printf("\t  HEY, THIS IS MINE!\n");
        usb_dev_handle *handle = usb_open(dev);
        printf("\t   HANDLE 0x%08x\n", (int) handle);
        //printf(handle, "1,5,62,75\n");
        usb_close(handle);
      }
    }
  }
}

问题是现在我想用设备发送/接收一点文本,但我不知道该怎么做。

我预计我应该从 usb_device 结构中的某些内容生成设备名称,然后像打开文件一样打开它(就像在 Windows 上所做的那样)。

如果那是正确的,我需要知道找出设备名称的正确方法...

我相信我正在使用 libusb。

我碰巧知道——正如当前配置/连接的——它是 ttyUSB0,但我想知道使用代码。

谢谢!

【问题讨论】:

  • 我记得读过关于这个主题的类似问题。搜索 [c] libusb vendor id 显示 6 个可能的线程。祝你好运。

标签: linux usb libusb udev usbserial


【解决方案1】:

我建议使用libusbp。它是一个带有 C++ 包装器的 C 库,并且有示例代码显示了如何根据 USB 设备的供应商 ID 和产品 ID 获取串行端口的名称:

https://github.com/pololu/libusbp/blob/master/examples/port_name/port_name.cpp

【讨论】:

  • 谢谢你;它看起来很有希望,但我较弱的 linux/gcc 技能和经验让事情变得非常困难。 “libusbp.hpp:没有这样的文件或目录”。我原以为通过提供 -lLibUSBP -rpath=/src/LibUSBP -L/src/LibUSBP 命令行参数可以做到这一点。显然,我对 gcc 的了解还不够。
  • Linux 文件名区分大小写,您的命令中的大小写错误。请参阅 libusbp README,其中讨论了如何安装它并编译使用它的程序。
  • 感谢您提供额外信息。无法让它工作;显然,我对 gcc 以及它如何找到库的理解非常薄弱。我知道的太少了,不能和这些东西混为一谈。我决定完全跳过这部分。
  • 我检查了libusbp,发现它确实使用libudev 来查找Linux 上的串行端口名称
【解决方案2】:

libusb 是一个用于与 USB 设备进行低级通信的库。但是当您的通信仅限于读取设备的 USB 描述符时 - libusb 不是最好的工具。

Linux 系统使用udev 子系统来管理热插拔设备。 udev 读取所有插入的 USB 设备的描述符并将它们存储在其数据库中。 libudev 是您应该用来获取诸如枚举设备的设备名称等信息的库。在您的情况下,您需要记住 usb_deviceusb_interface 是不同的东西 - 只有后者才会分配有 tty 设备文件。

或者,您可以使用udev 配置为您的特定设备分配一个恒定的设备名称。所以你不必寻找它。

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2011-05-10
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多