我正在运行 Ubuntu,我需要使用或类似的东西共享串行设备 ( /dev/ttyUSB0
) 。socat
这是我的图表:
/--</dev/ttyUSB01>--[Process A]
[serial device]-/dev/ttyUSB0--
\--</dev/ttyUSB02>--[Process B]
进程A和B都需要读写,并发没有问题。
如何创建两个“虚拟”设备,例如/dev/ttyUSB01
和/dev/ttyUSB02
?
答案1
以下和StackExchange 的建议,您是否尝试过对两个进程使用相同的设备名称?
或者,您是否有任何特殊需要创建两个伪设备,以便进程访问虚拟的“不同”串行端口?如果是,我将使用我的 3gModem 执行此 udev 符号链接技巧,但它可以应用于其他设备。请记住,它们仍然链接到同一设备。使用dmesg
我发现我的调制解调器是/dev/ttyUSB0
:
[ 224.777566] usbcore: registered new interface driver option
[ 224.778326] usbserial: USB Serial support registered for GSM modem (1-port)
[ 224.779065] option 1-1:1.0: GSM modem (1-port) converter detected
[ 224.780923] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
确定完整的设备路径(丑陋的名字):
[root@localhost ~]# udevadm info -q path -n /dev/ttyUSB0
/devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0/tty/ttyUSB0
通过完整的设备路径,获取所有信息。您将有一个很长的屏幕信息列表,因此我仅粘贴相关信息:
[root@localhost ~]# udevadm info -a -p /devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0/tty/ttyUSB0
looking at device '/devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:12.2/usb1/1-1/1-1:1.0/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="option1"
ATTRS{port_number}=="0"
现在,只需使用上一个命令中提取的信息在 Udev 上创建 2 个别名即可。我将创建一个名为50-modem.rules
at 的文件/etc/udev/rules.d
。您可以将其命名为任何您想要的名称,只要它以“.rules”结尾即可,但建议使用起始数字 50。
SUBSYSTEMS=="usb-serial",DRIVERS=="option1",ATTRS{port_number}=="0",SYMLINK+="3gmodem0"
SUBSYSTEMS=="usb-serial",DRIVERS=="option1",ATTRS{port_number}=="0",SYMLINK+="3gmodem1"
触发 udev 规则就可以了:
[root@localhost rules.d]# udevadm trigger
[root@localhost rules.d]# ls -l /dev/3g*
lrwxrwxrwx. 1 root root 7 Mar 25 19:55 /dev/3gmodem0 -> ttyUSB1
lrwxrwxrwx. 1 root root 7 Mar 25 19:55 /dev/3gmodem1 -> ttyUSB1