我有一个带有 16 个端口的调制解调器,用于发送短信。
当它连接到我的 Linux 机器时,我从ttyUSB0
到获得 16 个端口ttyUSB15
。目前,如果我删除此调制解调器并连接另一个调制解调器,我会从ttyUSB0
到获得 16 个端口ttyUSB15
。
如何通过创建udev
文件为特定供应商保留前 16 个端口,以便当我删除此调制解调器并插入另一个调制解调器时,它会从ttyUSB16
以后分配?
编辑
我的udev
规则文件内容如下,它正在工作,但每次重新插入时端口号都会改变。
Name=="Future Technology Devices International,Ltd",SUBSYSTEMS=="usb", ATTRS{idProduct}=="6011", ATTRS{idVendor}=="0403", SYMLINK="Ketan%b", KERNEL=="ttyUSB[0-15]*", MODE="0666", SYMLINK+="ttyUSB1",
输出
ls -l /dev/K*
lrwxrwxrwx 1 root root 7 2013-01-08 15:09 /dev/Ketan-8.1 -> ttyUSB1
lrwxrwxrwx 1 root root 7 2013-01-08 15:09 /dev/Ketan-8.2 -> ttyUSB5
lrwxrwxrwx 1 root root 8 2013-01-08 15:09 /dev/Ketan-8.3 -> ttyUSB11
lrwxrwxrwx 1 root root 8 2013-01-08 15:09 /dev/Ketan-8.4 -> ttyUSB12
这里的端口有 16 个,但它们被分成四个一组。 每次插入调制解调器时,ttyUSB
1
、5
、11
、值都会发生变化。12
答案1
ttyUSB0
如果你放宽使用-的要求ttyUSB31
,那么你可能就有一种可能性。我所做的就是udev
创建指向内核分配的设备节点的符号链接。您无法可靠地硬连线要使用的物理设备ttyUSB0
,但是您可以可靠地添加符号链接ttyUSB001
以指向您想要的任何设备节点。这里的技巧是,内核永远不会为设备节点分配一个以 开头的名称ttyUSB0..
,除了ttyUSB0
它本身。因此,此技巧适用于最多 99 个设备,但可以轻松更改为 4 位数字(和 999 个设备),只要保留第一个数字即可0
。
为此,您必须能够唯一地识别两个调制解调器。通过在拔出/插入设备时运行以下命令来检查它们是否具有唯一的序列号:
unbuffer udevadm monitor --environment | grep 'ID_SERIAL='
我不知道你的调制解调器,但这是/etc/udev/rules.d/60-persistent-serial.rules
我用来唯一标识每个 Arduino 的文件:
ACTION!="add", GOTO="persistent_serial_end"
SUBSYSTEM!="tty", GOTO="persistent_serial_end"
KERNEL!="ttyUSB[0-9]*", GOTO="persistent_serial_end"
# This is old 11.10 style: IMPORT="usb_id --export %p"
IMPORT{builtin}="path_id"
ENV{ID_SERIAL}=="04fc_RS232C_to_USB_Adapter" , SYMLINK="multimeter" , OWNER="jhendrix"
ENV{ID_SERIAL}=="FTDI_FT232R_USB_UART_A800FERY" , SYMLINK="arduinoMega1280-001" , SYMLINK+="ttyUSB001" , OWNER="jhendrix"
ENV{ID_SERIAL}=="FTDI_FT232R_USB_UART_A900F4EF" , SYMLINK="arduinoMega1280-002" , SYMLINK+="ttyUSB002" , OWNER="jhendrix"
ENV{ID_SERIAL}=="FTDI_FT232R_USB_UART_A900f3Kr" , SYMLINK="arduinoDuemilanove168-003" , SYMLINK+="ttyUSB003" , OWNER="jhendrix"
LABEL="persistent_serial_end"
当然,您必须替换一些内容OWNER
,例如 ,这是分配设备的用户,ENV{ID_SERIAL}
可以通过以下方式找到:
unbuffer udevadm monitor --environment | grep 'ID_SERIAL='
最后但并非最不重要的一点是,各种SYMLINK
s 应替换为您要使用的确切名称。该文件使我的任何 Arduino 都可以以三个名称使用(例如):
/dev/ttyUSB0 # dynamic, assigned by kernel upon plugging the device
/dev/arduinoMega1280-002 # static, symlink -> ttyUSB0
/dev/ttyUSB002 # static, symlink -> ttyUSB0 , this is what you are asking for.