[英]Need to find and open a USB serial device on linux
我正在編寫一個小型C應用程序,以便在將與Arduino對話的(Linux)QNAP NAS上運行(我對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,但我想使用代碼知道這一點。
謝謝!
我建議使用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
config為您的特定設備分配一個恆定的設備名稱。 因此,您不必尋找它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.