0

我有三个不同的串行设备连接到三个 USB 串行转换器 (FTDI USB-RS232)。如果我连接它们,我会按预期获得通用设备名称 /dev/ttyUSBx。当我尝试编写一些 udev 规则时,udevadm 向我显示了三个设备的相同输出,但某些设备序列号属性除外。

这些序列号会在每台设备上发生变化,所以如果我使用不同的 USB 串行转换器,我的规则将不再适用。因此,我需要一种与连接到串行转换器的特定设备通信并通过其响应识别它的方法。

“编写 udev 规则”HOWTO中,关于使用 PROGRAM 功能调用外部程序来命名设备的内容如下:

PROGRAM 用于运行产生设备名称的程序(除此之外它们不应该做任何事情)。在执行这些程序时,设备节点尚未创建,因此无法以任何方式对设备进行操作,

规则示例: SUBSYSTEM=="usb", PROGRAM="/bin/device_namer %k", SYMLINK+="%c"

所以我无法从那里写入 /dev/ttyUSBx 来识别设备。然后,我有 RUN 功能,但它似乎无法创建新的 SYMLINK,因为 udev 不会得到 RUN 的输出。

规则示例: SUBSYSTEM=="usb", RUN="/bin/program"

我可以从该 RUN 脚本中指示 udev 创建符号链接吗?或者我可以从那里手动创建该符号链接吗?

谢谢

4

2 回答 2

1

串口一连上电脑就自动盲聊是一件很可怕的事情。你确定你要这么做吗?首先,这将需要一些时间,如果 udev 在创建它之前必须等待结果,这将延迟设备节点的出现。如果设备碰巧断电或其串行端口断开连接,那么您将无法正确命名它(并且您需要超时才能检测到这一点)。最后,如果连接了您期望的设备之外的另一个设备,您可能会向它发送垃圾,从而产生意想不到的后果。

您可能会考虑依靠适配器的序列号来区分它们,并以一致的方式将每个适配器与外部设备相关联。如果您的适配器甚至真正的序列号而不是像 00000000 这样的占位符字符串,那么您已经很幸运了!

不过,这就是你要这样做的方式。

正如您所怀疑的,您不能使用RUN,因为为时已晚,设备节点已经创建。你必须使用PROGRAM. 在您的程序中,您将不得不自己创建设备节点,mknod因为 udev 尚未完成。您应该在临时位置创建一个临时节点并在程序退出之前将其销毁。

### Create the temporary device node in /tmp
device="/tmp/udev_device_guesser.$$"
# Note: mknod does not appear to be vulnerable to a symlink attack
mknod "$device" c "$MAJOR" "$MINOR"

### Use this device node to query what's attached to the serial port
insert your code here

### Get rid of the temporary node
rm -f "$device"
exit 0
于 2011-12-28T06:50:02.043 回答
1

PROGRAM尽管有文档说,实际上可以使用基于设备响应的设备符号链接创建设备符号链接。它仅适用于符号链接,而不适用于设备名称。

请注意,与您的 AFTER 匹配并指定 a 的每个规则都SYMLINK应该是这样的,

SYMLINK+=

因此您的 SIMLINK 规范将与新规范连接。在其他情况下,您的符号链接将被删除。

了解正在发生的事情的最佳方法udev是将日志级别设置为调试:

sudo udevadm control --log-priority=debug

您会在/var/log/messages或中找到这些日志/var/log/syslog,具体取决于您的发行版。

于 2012-07-27T12:46:17.787 回答