linux 查看libusb版本,linux / libusb获取usb设备路径

我使用libusb来枚举一些usb设备.现在我想获得“设备路径”.我认为这不是usb device-path,因为我没有成功使用谷歌.

如果我用linux连接usb设备,我会在dmesg中收到一条消息,这里有一些带有usb温度传感器的“设备路径”的例子(类似于this):@H_301_3@

直接到usb端口:

[68448.099682] generic-usb 0003:0C45:7401.0056:输入,hidraw1:USB HID v1.10键盘[RDing TEMPer1V1.2] on usb-0000:00:12.0-1 / input0 => 12.0-1@H_301_3@

直接到另一个港口:

[68560.853108] generic-usb 0003:0C45:7401.0058:输入,hidraw1:USB HID v1.10键盘[RDing TEMPer1V1.2] on usb-0000:00:13.0-1 / input0 => 13.0-1@H_301_3@

到第一个使用端口的USB集线器:

[68600.245809] generic-usb 0003:0C45:7401.005A:输入,hidraw1:USB HID v1.10键盘[RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4 / input0 => 12.2-1.4@H_301_3@

到同一USB集线器上的另一个端口:

[68647.925092] generic-usb 0003:0C45:7401.005C:输入,hidraw1:USB HID v1.10键盘[RDing TEMPer1V1.2] on usb-0000:00:12.2-1.3 / input0 => 12.2-1.3@H_301_3@

现在用于以前使用的usb集线器上的usb集线器:

[68740.715518] generic-usb 0003:0C45:7401.005E:输入,hidraw1:USB HID v1.10键盘[RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4.4 / input0 => 12.2-1.4.4@H_301_3@

长话短说:

内核消息始终包含物理USB设备位置的唯一路径(请参阅之前的粗体文本).是否有可能通过libusb在用户空间中获得这条“路径”?我用struct usb_bus和struct usb_device尝试了很多东西,但我总是没有成功.@H_301_3@

我需要这个来识别这些usb温度计中的多个,因为它们没有唯一的序列号,有时它们只是在运行时“重新连接”,因此它们会得到不同的usb id.所以我认为识别它们的唯一方法是通过物理位置.@H_301_3@

谢谢您的帮助,@H_301_3@

最好的祝福

凯文M.@H_301_3@

-编辑-@H_301_3@

目前我使用以下代码来搜索我的USB设备:@H_301_3@usb_dev_handle *find_lvr_winusb() {

struct usb_bus *bus;

struct usb_device *dev;

for (bus = usb_busses; bus; bus = bus->next) {

for (dev = bus->devices; dev; dev = dev->next) {

if (dev->descriptor.idVendor == VENDOR_ID &&

dev->descriptor.idProduct == PRODUCT_ID ) {

usb_dev_handle *handle;

if(debug) {

printf("lvr_winusb with Vendor Id: %x and Product Id: %x found.\n",VENDOR_ID,PRODUCT_ID);

printf("INFO: %d\n",dev->bus->location);

printf("INFO: %d %s\n",bus->location,bus->dirname);

}

if (!(handle = usb_open(dev))) {

printf("Could not open USB device\n");

return NULL;

}

return handle;

}

}

}

return NULL;

}

但是使用此代码我无法获得唯一的物理位置ID. bus->位置返回一个整数(bus-> dirname包含相同的,但作为字符串),这不是唯一的.我知道usb有一个层次结构,在dmesg中我可以看到这个层次结构的路径.@H_301_3@

使用libusb我只能得到总线ID(?)和一些设备ID.但他们没有帮助我,因为我需要识别这些温度传感器中的两个或更多个.当温度传感器复位连接(每5到60秒)并且总线ID不唯一时,device-id总是会改变.不幸的是,温度传感器没有唯一的序列号.@H_301_3@

所以我认为物理路径是识别设备的唯一方法.@H_301_3@

最好的祝福

凯文M.@H_301_3@

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux上进行USB转串口编程需要使用libusb库和串口通信库,比如libserialport库。 首先需要安装libusb和libserialport库,可以使用以下命令进行安装: ``` sudo apt-get install libusb-dev libserialport-dev ``` 然后可以使用libusb库来获取USB设备的信息,比如设备ID和端口号。接下来,需要打开串口设备并进行读写操作。可以使用libserialport库来打开串口设备,设置串口参数,读写数据等。下面是一个简单的示例代码: ``` #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <libusb-1.0/libusb.h> #include <libserialport.h> #define VENDOR_ID 0x1234 #define PRODUCT_ID 0x5678 int main(int argc, char **argv) { int ret; struct libusb_device_handle *dev_handle; struct sp_port *serial_port; // 初始化libusb库 ret = libusb_init(NULL); if (ret < 0) { fprintf(stderr, "libusb_init error: %s\n", libusb_error_name(ret)); return -1; } // 查找USB设备 dev_handle = libusb_open_device_with_vid_pid(NULL, VENDOR_ID, PRODUCT_ID); if (dev_handle == NULL) { fprintf(stderr, "libusb_open_device_with_vid_pid error\n"); libusb_exit(NULL); return -1; } // 获取USB设备端口号 int port = libusb_get_port_number(libusb_get_device(dev_handle)); printf("Device port number: %d\n", port); // 打开串口设备 serial_port = sp_new(); if (serial_port == NULL) { fprintf(stderr, "sp_new error\n"); libusb_close(dev_handle); libusb_exit(NULL); return -1; } ret = sp_open(serial_port, "/dev/ttyUSB0", SP_MODE_READ_WRITE); if (ret < 0) { fprintf(stderr, "sp_open error: %s\n", sp_last_error_message()); sp_free(serial_port); libusb_close(dev_handle); libusb_exit(NULL); return -1; } // 设置串口参数 sp_set_baudrate(serial_port, 115200); sp_set_bits(serial_port, 8); sp_set_parity(serial_port, SP_PARITY_NONE); sp_set_stopbits(serial_port, 1); // 读写数据 char buf[256]; size_t nbytes; nbytes = sp_blocking_read(serial_port, buf, sizeof(buf), 1000); if (nbytes > 0) { printf("Read %zd bytes from serial port: %.*s\n", nbytes, (int)nbytes, buf); } nbytes = snprintf(buf, sizeof(buf), "Hello, world!"); ret = sp_blocking_write(serial_port, buf, nbytes, 1000); if (ret < 0) { fprintf(stderr, "sp_blocking_write error: %s\n", sp_last_error_message()); } // 关闭串口设备USB设备,释放资源 sp_close(serial_port); sp_free(serial_port); libusb_close(dev_handle); libusb_exit(NULL); return 0; } ``` 在代码中,VENDOR_ID和PRODUCT_ID分别为USB设备的厂商ID和产品ID,可以通过lsusb命令查看。/dev/ttyUSB0为串口设备路径,可以根据实际情况进行修改。在读写数据时,可以使用sp_blocking_read和sp_blocking_write函数进行阻塞式读写操作。 注意:在运行程序前需要将当前用户添加到dialout用户组中,命令为: ``` sudo adduser <username> dialout ``` 其中<username>为当前用户名。这样才能访问串口设备

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值