在开发过程中,需要用一个树莓派链接多个串口转USB设备(GPS模块,数传模块等),在树莓派linux系统环境下,USB串口设备的命名规则是 /dev/ttyUSB0 ,/dev/ttyUSB1,/dev/ttyUSB2。串口设备的命名规则一般是根据设备插拔顺序进行命名,第一个插入的USB串口设备名称为/dev/ttyUSB0,第二个名称为 /dev/ttyUSB1,以此类推,但是在实验环境中,往往会发生USB设备插拔情况,从而导致串口设备命名混乱,为此,需要对串口设备进行名称绑定,固定串口设备名称。
在实现串口名称绑定操作前,首先介绍一下udev。udev是Linux系统下的设备管理工具,运行在用户空间下,能够通过侦听内核发出的ueven事件来管理./dev目录下设备文件,当USB设备进行插拔时,udev能够在/dev下添加和删除设备文件。在默认规则下,udev为所有linux设备定义了内核设备名称,比如/dev/sda,/dev/hda。另外,linux用户也可以编写自定义的规则文件,自定义标志设备文件。 udev的规则文件存放在/etc/udev/rule.d 目录,规则的命名以.rules为后缀。
下面给出树莓派linux环境下进行串口设备自定义命名步骤:
1.查看串口设备系统自定义的名称
pi@testclient:~ $ ls /dev | grep 'ttyUSB' ttyUSB0 ttyUSB1
2.根据串口号,查询串口设备的详细信息
/dev/ttyUSB0
pi@testclient:~ $ udevadm info /dev/ttyUSB0 P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0/tty/ttyUSB0 N: ttyUSB0 S: serial/by-id/usb-FTDI_FT232R_USB_UART_A8008Sxy-if00-port0 S: serial/by-path/platform-3f980000.usb-usb-0:1.4:1.0-port0 S: ttyUSB4G E: DEVLINKS=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A8008Sxy-if00-port0 /dev/serial/by-path/platform-3f980000.usb-usb-0:1.4:1.0-port0 /dev/ttyUSB4G E: DEVNAME=/dev/ttyUSB0 E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0/tty/ttyUSB0 E: ID_BUS=usb E: ID_MODEL=FT232R_USB_UART E: ID_MODEL_ENC=FT232R\x20USB\x20UART E: ID_MODEL_FROM_DATABASE=FT232 USB-Serial (UART) IC E: ID_MODEL_ID=6001 E: ID_PATH=platform-3f980000.usb-usb-0:1.4:1.0 E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_4_1_0 E: ID_REVISION=0600 E: ID_SERIAL=FTDI_FT232R_USB_UART_A8008Sxy E: ID_SERIAL_SHORT=A8008Sxy E: ID_TYPE=generic E: ID_USB_DRIVER=ftdi_sio E: ID_USB_INTERFACES=:ffffff: E: ID_USB_INTERFACE_NUM=00 E: ID_VENDOR=FTDI E: ID_VENDOR_ENC=FTDI E: ID_VENDOR_FROM_DATABASE=Future Technology Devices International, Ltd E: ID_VENDOR_ID=0403 E: MAJOR=188 E: MINOR=0 E: SUBSYSTEM=tty E: TAGS=:systemd: E: USEC_INITIALIZED=9427187
/dev/ttyUSB1
udevadm info /dev/ttyUSB1 P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB1/tty/ttyUSB1 N: ttyUSB1 S: serial/by-id/usb-FTDI_USB-RS232_Cable_FT2NUESH-if00-port0 S: serial/by-path/platform-3f980000.usb-usb-0:1.2:1.0-port0 S: ttyUSBGPS E: DEVLINKS=/dev/serial/by-id/usb-FTDI_USB-RS232_Cable_FT2NUESH-if00-port0 /dev/serial/by-path/platform-3f980000.usb-usb-0:1.2:1.0-port0 /dev/ttyUSBGPS E: DEVNAME=/dev/ttyUSB1 E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB1/tty/ttyUSB1 E: ID_BUS=usb E: ID_MODEL=USB-RS232_Cable E: ID_MODEL_ENC=USB-RS232\x20Cable E: ID_MODEL_FROM_DATABASE=FT232 USB-Serial (UART) IC E: ID_MODEL_ID=6001 E: ID_PATH=platform-3f980000.usb-usb-0:1.2:1.0 E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_2_1_0 E: ID_REVISION=0600 E: ID_SERIAL=FTDI_USB-RS232_Cable_FT2NUESH E: ID_SERIAL_SHORT=FT2NUESH E: ID_TYPE=generic E: ID_USB_DRIVER=ftdi_sio E: ID_USB_INTERFACES=:ffffff: E: ID_USB_INTERFACE_NUM=00 E: ID_VENDOR=FTDI E: ID_VENDOR_ENC=FTDI E: ID_VENDOR_FROM_DATABASE=Future Technology Devices International, Ltd E: ID_VENDOR_ID=0403 E: MAJOR=188 E: MINOR=1 E: SUBSYSTEM=tty E: TAGS=:systemd: E: USEC_INITIALIZED=437296
3 在 /etc/udev/rules.d/ 目录下新建一个规则文件。udev 是根据规则的字母顺序来解析规则文件的命名规则的,并根据匹配的规则进行相应设备的命名,所以解析顺序很关键。在pi中,已经存在一个规则文件99-com.rules,为了能解析新建规则, 把新建的规则文件命名为98-com-udev.rules,并将下面的信息复制到新建规则文件中。ID_SERIAL_SHORT、ID_PATH 字段用于标识设备,由步骤2可以提取出来,SYMLINK 指定需要命名的名称。
ENV{ID_SERIAL_SHORT}=="A8008Sxy",ENV{ID_PATH}=="platform-3f980000.usb-usb-0:1.4:1.0",SYMLINK+="ttyUSB4G" ENV{ID_SERIAL_SHORT}=="FT2NUESH",ENV{ID_PATH}=="platform-3f980000.usb-usb-0:1.2:1.0",SYMLINK+="ttyUSBGPS"
4 设备重启reboot ,重启之后,自定义命名规则将生效。插拔USB串口,自定义名称固定不变。
pi@testclient:~ $ ls /dev/ | grep "ttyUSB" ttyUSB0 ttyUSB1 ttyUSB4G ttyUSBGPS
5 自定义串口名称测试
>>> import serial >>> ser=serial.Serial('/dev/ttyUSB4G',9600) >>> ser=serial.Serial('/dev/ttyUSBGPS',9600) >>> print(串口测试通过)
参考链接:
1.https://cloud.tencent.com/info/9ef3d565fa5a45f6ee60e6c996bb5b91.html
2.http://www.cnblogs.com/lpfuture/p/6027091.html