在用室外光电的工控机时候,需要同时连接激光雷达和imu
但是用lsusb查询时候发现,这两个的设备的usb接口ID显示相同(即冲突了)
最简单粗暴的解决办法是,换个厂家的usb转ttl,这样可以避免冲突,这也相当于在硬件上解决
软件上解决的办法较为麻烦,参考如下:
解决方法是增加额外的信息来区分拥有相同idVendor与idProduct的设备。
激光雷达与IMU分别对应ttyUSB0与ttyUSB1。
在命令行中输入以下命令可以查看对应的ttyUSB0的详细信息:
udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0
会得到这样的输出:
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0':KERNEL=="ttyUSB0"SUBSYSTEM=="usb-serial"DRIVER=="ch341-uart"ATTR{port_number}=="0"looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0':KERNELS=="1-1.2:1.0"SUBSYSTEMS=="usb"DRIVERS=="ch341"ATTRS{authorized}=="1"ATTRS{bAlternateSetting}==" 0"ATTRS{bInterfaceClass}=="ff"ATTRS{bInterfaceNumber}=="00"ATTRS{bInterfaceProtocol}=="02"ATTRS{bInterfaceSubClass}=="01"ATTRS{bNumEndpoints}=="03"ATTRS{supports_autosuspend}=="1"looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2':KERNELS=="1-1.2"SUBSYSTEMS=="usb"DRIVERS=="usb"ATTRS{authorized}=="1"... ...
同理查看ttyUSB1的详细信息,然后对比找出两者的不同之处,然后加在rules.d里面;
比如,在反复对比之后,工控机的激光雷达和imu的输出不同之处在于:
第三层级的设备描述信息中的KERNELS属性是不同的,因此可以用该属性对设备进行区分。
e.g,imu修改后的规则是:(多了一个kernels)
KERNEL=="ttyUSB*", KERNELS=="1-4.4", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="imu"
修改完成之后将.rules文件放入/etc/udev/rules.d文件夹中,像USB这类热插拔设备通常需要重新插拔才能使新规则生效。
还有个需要注意的问题!!
之后插拔设备的时候,一定一定要注意顺序!!不然的话,ttyUSB0和ttyUSB1会出错,导致其不能正常工作
现在工控机的接线是先激光雷达再imu