为调制解调器保留端口

为调制解调器保留端口

我有一个带有 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 1511、值都会发生变化。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='

最后但并非最不重要的一点是,各种SYMLINKs 应替换为您要使用的确切名称。该文件使我的任何 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.

检查我的有关此内容的私人 wiki 文章以获取更多详细信息

相关内容