我想枚举 Linux 系统上的串行端口并获取它们的唯一且稳定(跨重新启动)的标识符。稳定是指当我插入和拔出串行 USB 设备(相同的 USB 端口)时,我希望获得相同的标识符。此外,当我重新启动机器时,相同的串行端口应该获得相同的标识符。这应该是与设备无关的,所以我不想为我插入的每个设备设置特定的 udev 规则。它应该以通用方式工作。
起初我认为内核 devpath 可以用于此目的,但这并不那么容易(见下文)
要列出我们可以使用的串行接口的 devpath
realpath /sys/class/tty/*/device
对于我的系统来说,这会产生
/sys/devices/pnp0/00:02
/sys/devices/pnp0/00:03
/sys/devices/platform/serial8250
/sys/devices/platform/serial8250
(当然,“serial8250”条目可能不是真的,但这不是这里的问题)
我们看到有重复的条目,这意味着内核 devpath 不是实际串行端口的唯一标识符。
所以问题是如何为串行端口获取唯一且稳定(跨重新启动)的标识符?
另一方面,我们在tty/
条目列表下找到似乎包含实际端口信息的条目,其中包括“行”条目
/sys/devices/pnp0/00:02/tty/ttyS0/line
/sys/devices/pnp0/00:03/tty/ttyS1/line
/sys/devices/platform/serial8250/tty/ttyS2/line
/sys/devices/platform/serial8250/tty/ttyS3/line
包含一个数字。 (在本例中为 0 ... 4)
这的语义是什么/<devpath>/tty/<id>/line
?只是任意编号吗?问题是 USB 串行端口没有“线路”条目。
此外,下面的条目/<devpath>/tty/
似乎相互依赖,因此涉及一些全局编号。所以我不确定如果我连接多个串行 USB 设备会发生什么。它们是否会收到不同的名称<devpath1>/tty/ttyUSB0
,并且<devpath2>/tty/ttyUSB1
取决于它们插入的顺序,还是都有一个<devpath>/tty/ttyUSB0
?前一种情况会很糟糕,因为编号取决于它们插入的顺序(或者在重新启动时是随机的)。