Linux串口ttyUSB修改别名

发布时间 2023-08-30 16:00:36作者: 蓝莓薄荷

背景

Linux环境下经常会遇到USB设备节点不固定的问题。通常设备节点名为ttyUSBx(x代表任意数字),Linux内核会根据设备插入的先后顺序进行编号的分配,即第一个插入的设备编号为ttyUSB0、第二个插入的设备编号为ttyUSB1,依次类推。

然而,当我们重启Linux系统或者重新插拔USB设备后,Linux内核会重新分配每个设备的编号,原来的设备编号会发生改变。我们无法保证设备A的设备节点就是ttyUSB0,设备B的设备节点就是ttyUSB1,在设备文件/dev目录下没有提供固定显示ttyUSB的方法。因此,如果仅仅以设备节点ttyUSBx来区分具体是哪个设备,很容易造成程序的混乱。

其实,Linux主机或者服务器的每个USB端口都有一个唯一的端口号,相当于每个员工的工位。因此,我们可以根据端口号来区分每个设备。简单来说,就是固定设备插入到指定的USB端口(如:设备A插入到端口1),然后根据端口号找到挂载在这个端口号上面的USB设备节点。(这个就好比我们可以通过员工工位来找到对应的员工)。

按照以上逻辑,我们还可以根据端口号来自定义串口设备节点的名称,如自定义设备A的节点为ttyUSB_A

具体方法

  1. 插入串口设备,查看/dev目录下系统自动分配的设备节点

    [root@linux ~]# ls -l /dev/ttyUSB*
    crw-rw---- 1 root dialout 188, 0 Aug 30 15:13 /dev/ttyUSB0
    

    可以看出,当前设备的节点为ttyUSB0

  2. 输入以下命令查看当前设备节点(ttyUSB0)所在的USB端口号

    udevadm info -a -n /dev/ttyUSB0 | grep KERNELS
    

    结果如下:

    KERNELS=="ttyUSB0"
    KERNELS=="1-1.1:1.0"
    KERNELS=="1-1.1"
    KERNELS=="1-1"
    KERNELS=="usb1"
    KERNELS=="0000:01:00.0"
    KERNELS=="0000:00:00.0"
    KERNELS=="pci0000:00"
    KERNELS=="fd500000.pcie"
    KERNELS=="scb"
    KERNELS=="platform"
    

    其中,第三行的值为当前设备节点ttyUSB0所在的端口号:1-1.1

  3. 输入以下指令新增udev规则文件,自定义端口别名

    sudo vim /etc/udev/rules.d/usb-serial.rules
    

    写入内容如下:

    SUBSYSTEM=="tty", KERNELS=="1-1.1", SYMLINK+="ttyUSB_A", MODE="0666"
    

    上面KERNELS的值为端口号1-1.1SYMLINK的值为我们自定义的设备节点别名ttyUSB_A,保存并退出

  4. 重新加载udev规则

    sudo udevadm control --reload-rules
    sudo service udev restart
    sudo udevadm trigger
    
  5. 加载完毕后,再次查看/dev下的设备节点

    [root@linux ~]# ls -l /dev/ttyUSB*
    crw-rw-rw- 1 root dialout 188, 0 Aug 30 15:38 /dev/ttyUSB0
    lrwxrwxrwx 1 root root         7 Aug 30 15:38 /dev/ttyUSB_A -> ttyUSB0
    

    可以看出,上面出现了我们自定义的设备节点ttyUSB_AttyUSB_A实际上是ttyUSB0设备节点的端口映射,之后我们就可以通过使用ttyUSB_A节点来对串口设备进行打开、关闭等操作了。