Linux串口ttyUSB修改别名
背景
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
。
具体方法
-
插入串口设备,查看
/dev
目录下系统自动分配的设备节点[root@linux ~]# ls -l /dev/ttyUSB* crw-rw---- 1 root dialout 188, 0 Aug 30 15:13 /dev/ttyUSB0
可以看出,当前设备的节点为
ttyUSB0
-
输入以下命令查看当前设备节点(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
-
输入以下指令新增udev规则文件,自定义端口别名
sudo vim /etc/udev/rules.d/usb-serial.rules
写入内容如下:
SUBSYSTEM=="tty", KERNELS=="1-1.1", SYMLINK+="ttyUSB_A", MODE="0666"
上面
KERNELS
的值为端口号1-1.1
,SYMLINK
的值为我们自定义的设备节点别名ttyUSB_A
,保存并退出 -
重新加载udev规则
sudo udevadm control --reload-rules sudo service udev restart sudo udevadm trigger
-
加载完毕后,再次查看
/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_A
,ttyUSB_A
实际上是ttyUSB0
设备节点的端口映射,之后我们就可以通过使用ttyUSB_A
节点来对串口设备进行打开、关闭等操作了。