簡體   English   中英

需要在Linux上找到並打開USB串行設備

[英]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_deviceusb_interface是分開的東西-只有后者會分配tty設備文件。

或者,您可以只使用udev config為您的特定設備分配一個恆定的設備名稱。 因此,您不必尋找它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM