我正在使用运行 Raspian 的 Raspberry Pi 来控制一些家庭自动化硬件。一个硬件通过 RS232 进行通信,因此它使用 USB 转 RS232 适配器连接到我的 RPi。另一个通过 USB 连接,但模拟串行端口。
当我只使用一件硬件时,一切都很好:我只需告诉我的软件使用/dev/ttyUSB0
,一切都很好。
问题是当我同时连接两者时。一台设备显示为ttyUSB0
,另一台设备显示为ttyUSB1
,这很好,但每次重新启动时,哪个硬件设备将分配给哪个设备文件基本上是随机的,尽管甚至没有将它们从 RPi 上拔下。
重新启动后,我经常发现控制软件很混乱,因为它与错误的设备通信。有没有办法可以将设备“硬编码”到设备文件?
答案1
对于串行设备,您应该在 下找到它们按拓扑命名/dev/serial/by-path/
,因此,如果您使用相同的 USB 集线器和端口,它应该保持不变。例如:
ls -l /dev/serial/by-path/pci-0000:04:00.0-usb-0:2.1.1:1.0-port0
... /dev/serial/by-path/pci-0000:04:00.0-usb-0:2.1.1:1.0-port0 -> ../../ttyUSB0
同样,您应该按名称(有时包括序列号)在 下查找设备,/dev/serial/by-id/
例如:
ls -l /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A5771WOA-if00-port0
... /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A5771WOA-if00-port0 -> ../../ttyUSB0
答案2
您可以为此使用 udev 规则。 udev 规则可以通过序列号匹配 USB 设备,并允许您在/dev
.
像这样的 udev 规则应该足以创建/dev
指向真实设备节点的符号链接:
SUBSYSTEM=="usb", ATTRS{serial}=="<serial number>", SYMLINK+="USBserial1"
看编写 udev 规则丹尼尔·德雷克(Daniel Drake)的详细信息。