您可以通过使用 udev 规则来固定 USB 设备的串口节点名。以下是一个基本的流程:

  1. 打开终端并切换到 root 用户或以 sudo 权限运行。

  2. 使用文本编辑器(如 nano、vi 等)创建或编辑一个 udev 规则文件,例如 /etc/udev/rules.d/99-usb-serial.rules

  3. 在规则文件中添加规则,为每个特定设备固定一个串口节点名。规则的格式如下:其中,xxxx 和 yyyy 是 USB 设备的 Vendor ID 和 Product ID。可以通过运行 lsusb 命令查看它们。my_usb_serial 是为设备指定的固定节点名,可以根据自己的需要进行命名。

    SUBSYSTEM=="tty", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="my_usb_serial"
    

    对于相同的两根串口线,接到工控机上后在lsusb中显示的id号则是一样的,用传统的绑定方法无法绑定,所以得先查看设备的kernel值,每个设备的kernel是不一样的。所以采用kernel来绑定。

    dmesg – 打印 USB 设备名。查看每个串口设备对应的kernel和id

    SUBSYSTEM=="tty", KERNELS=="zzzz", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="my_usb_serial"
    
  4. 保存并关闭规则文件。

  5. 拔掉 USB 设备,然后重新连接。

  6. 确认设备已被识别,并检查是否生成了预期的固定节点名。

请确保替换规则中的 xxxx 和 yyyy 为您实际设备的 Vendor ID 和 Product ID。通过这种方式,在重启或重新插拔设备后,您应该能够获得持久且一致的串口节点名(例如 /dev/my_usb_serial),以便更方便地区分设备。

请注意,udev 规则的语法和文件位置可能因不同的 Linux 发行版而有所差异。在实际操作过程中,请根据您使用的系统进行相应的调整。

一些重要参数

udev 规则的匹配键:

**ACTION**:事件(uevent)的行为,例如:add(添加设备)、remove(删除设备);
**KERNEL**:内核设备名称,例如:sda,cdrom;
**DEVPATH**:设备的 devpath 路径;
**SUBSYSTEM**:设备的子系统名称,例如:sda 的系统为 block;
**BUS**:设备在 devpath 里的总线名称,例如:usb;DRIVER:设备在 devpath 的设备驱动名称,例如:ide-cdrom;
**ID**:设备在 devpath 里的识别号;
//在一条规则中,可以设定最多五条 SYSFS 的匹配键。
**SYSFS{filename}**:设备的 devpath 路径下,设备的属性文件 "filename" 里的内容;例如:SYSFS{model}== "ST936701SS" 表示:如果设备的型号为 ST936701SS,则该设备匹配该匹配键。
**ENV{key}**:环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键;
**PROGRAM**:调用外部命令;例如:PROGRAM=="/lib/udev/scsi_id -g -s $devpath", RESULT=="35000c50000a7ef67",调用外部命令 /lib/udev/scsi_id 查询设备的 SCSI ID,如果返回结果为 35000c50000a7ef67,则该设备匹配该 匹配键。
**RESULT**:外部命令 PROGRAM 的返回结果。

udev 的重要赋值键:

**NAME**:在 /dev 下产生的设备文件名。只有第一个对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件;
**SYMLINK**:为 /dev/ 下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。
**OWNER,GROUP,MODE**:为设备设定权限;
**ENV{key}**:导入一个环境变量。

udev 的值和可调用的替换操作符:

在键值对中的键和操作符都介绍完乐,最后是值(value)。Linux 用户可以随意地定制 udev 规则文件的值。例如:my_root_disk,my_printer。同时也可以引用下面的替换操作符:

$kernel,%k:设备的内核设备名称,例如:sda、cdrom;
$number,%n:设备的内核号码,例如:sda3 的内核号码是 3;
$devpath,%p:设备的 devpath 路径;
$id,%b:设备在 devpath 里的 ID 号;
$sysfs{file},%s{file}:设备的 sysfs 里 file 的内容,其实就是设备的属性值;例如:$sysfs{size} 表示该设备(磁盘)的大小。
$env{key},%E{key}:一个环境变量的值。
$major,%M:设备的 major 号;
$minor,%m:设备的 minor 号;
$resule,%c:PROGRAM 返回的结果;
$parent,%P:父设备的设备文件名;
$root,%r:udev_root 的值,默认是 /dev/;
$tempnode,%N:临时设备名;
%%:符号 % 本身;
$$:符号 $ 本身;

重新加载 udev 规则