August 06, 2020
라즈베리파이에서 시리얼 통신할 때 USB 포트가 변경되면서 끊어지는 현상 발생.
USB 장치의 고유 정보를 이용해서 포트가 변경돼도 변경된 포트로 통신이 이어지도록 이름을 지정해 줄 수 있다.
터미널에서 dmesg | grep ttyUSB
입력
$ dmesg | grep ttyUSB
[ 5.652316] usb 1-1.1.2: FTDI USB Serial Device converter now attached to ttyUSB0
여기서 필요한 정보
usb
다음에 오는 문자. 여기서는 1-1.1.2
ttyUSB0
터미널에서 udevadm info --name=/dev/ttyUSB0 --attribute-walk
입력
looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2':
KERNELS=="1-1.1.2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{idProduct}=="6001"
ATTRS{devnum}=="4"
ATTRS{bNumConfigurations}=="1"
ATTRS{devpath}=="1.1.2"
ATTRS{serial}=="AR0JXJ3Q"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="FTDI"
ATTRS{busnum}=="1"
ATTRS{bmAttributes}=="a0"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{quirks}=="0x0"
ATTRS{devspec}==" (null)"
ATTRS{configuration}==""
ATTRS{bDeviceSubClass}=="00"
ATTRS{tx_lanes}=="1"
ATTRS{rx_lanes}=="1"
ATTRS{product}=="FT232R USB UART"
ATTRS{urbnum}=="5488424"
ATTRS{ltm_capable}=="no"
ATTRS{version}==" 2.00"
ATTRS{bMaxPower}=="90mA"
ATTRS{removable}=="removable"
ATTRS{bcdDevice}=="0600"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bDeviceClass}=="00"
ATTRS{bNumInterfaces}==" 1"
ATTRS{idVendor}=="0403"
ATTRS{bConfigurationValue}=="1"
ATTRS{maxchild}=="0"
ATTRS{speed}=="12"
looking at parent device
라고 나오는 줄의 끝 문자열이 1-1.1.2
인 부분을 찾는다.
여러 속성 중에서 장치를 특정할 수 있는 정보를 기억해 둘 것.
예를 들어 ATTRS{idProduct}=="6001"
이 부분을 기억해 둔다.
일반적으로 idProduct
, idVendor
, serial
을 사용.
USB 포트 이름 규칙 생성
/etc/udev/rules.d/
폴더 안에 .rules
파일 생성.
예를 들어 sudo nano /etc/udev/rules.d/10-usb-serial.rules
파일명에서 숫자 10은 rules 파일 실행 우선순위를 나타내는데 굳이 안 따라도 된다.
파일 안에 다음처럼 입력하고 저장
SUBSYSTEM=="tty", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", ATTRS{serial}=="AR0JXJ3Q", SYMLINK+="ttyUSB_DEV1"
SYMLINK
에 있는 ttyUSB_DEV1
이 앞으로 사용하게 될 포트 명이다. 당연히 다른 이름으로 해도 됨.
sudo udevadm trigger
명령으로 변경사항 적용ls -l /dev/ttyUSB*
을 쳐서 변경사항 확인
$ ls -l /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 Aug 5 03:19 /dev/ttyUSB0
lrwxrwxrwx 1 root root 7 Aug 5 03:19 /dev/ttyUSB_DEV1 -> ttyUSB0
참고