需要在 linux 上找到并打开 USB 串行设备
Need to find and open a USB serial device on linux
我正在我的 (Linux) QNAP NAS 上为 运行 编写一个小型 C 应用程序,它将与 Arduino 通信(我对 arduino 的任何 USB 代码都没有困难). (arduino 上有一个受信任的应用程序,可以通过 USB 串口接受文本命令。)
我的愿望是使用 USB vendor/product 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);
}
}
}
}
问题是现在我想 send/receive 使用设备发送一些文本,但我不知道该怎么做。
我预计我应该从 usb_device 结构中的某些内容生成一个设备名称,然后像打开文件一样打开它(就像在 Windows 上所做的那样)。
如果这是正确的,我需要知道找出设备名称的正确方法...
我相信我正在使用 libusb。
我碰巧知道——目前 configured/connected——它是 ttyUSB0,但我想知道使用代码。
谢谢!
我建议使用 libusbp。它是一个带有 C++ 包装器的 C 库,并且有示例代码显示如何根据 USB 设备的供应商 ID 和产品 ID 获取串行端口的名称:
https://github.com/pololu/libusbp/blob/master/examples/port_name/port_name.cpp
libusb
是一个用于与 USB 设备进行低级通信的库。但是当您的通信仅限于读取设备的 USB 描述符时 - libusb
不是最好的工具。
Linux 系统使用 udev
子系统来管理热插拔设备。 udev
读取所有插入的 USB 设备的描述符并将它们存储在其数据库中。 libudev
是您应该用来获取诸如枚举设备的设备名称之类的信息的库。在您的情况下,您需要记住 usb_device
和 usb_interface
是不同的东西 - 只有后者才会分配给它 tty
设备文件。
或者您可以只使用 udev
配置为您的特定设备分配一个固定的设备名称。所以你不必寻找它。
我正在我的 (Linux) QNAP NAS 上为 运行 编写一个小型 C 应用程序,它将与 Arduino 通信(我对 arduino 的任何 USB 代码都没有困难). (arduino 上有一个受信任的应用程序,可以通过 USB 串口接受文本命令。)
我的愿望是使用 USB vendor/product 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);
}
}
}
}
问题是现在我想 send/receive 使用设备发送一些文本,但我不知道该怎么做。
我预计我应该从 usb_device 结构中的某些内容生成一个设备名称,然后像打开文件一样打开它(就像在 Windows 上所做的那样)。
如果这是正确的,我需要知道找出设备名称的正确方法...
我相信我正在使用 libusb。
我碰巧知道——目前 configured/connected——它是 ttyUSB0,但我想知道使用代码。
谢谢!
我建议使用 libusbp。它是一个带有 C++ 包装器的 C 库,并且有示例代码显示如何根据 USB 设备的供应商 ID 和产品 ID 获取串行端口的名称:
https://github.com/pololu/libusbp/blob/master/examples/port_name/port_name.cpp
libusb
是一个用于与 USB 设备进行低级通信的库。但是当您的通信仅限于读取设备的 USB 描述符时 - libusb
不是最好的工具。
Linux 系统使用 udev
子系统来管理热插拔设备。 udev
读取所有插入的 USB 设备的描述符并将它们存储在其数据库中。 libudev
是您应该用来获取诸如枚举设备的设备名称之类的信息的库。在您的情况下,您需要记住 usb_device
和 usb_interface
是不同的东西 - 只有后者才会分配给它 tty
设备文件。
或者您可以只使用 udev
配置为您的特定设备分配一个固定的设备名称。所以你不必寻找它。