/dev/ttyUSB0
때로는 바인딩 하고 때로는 실패 /dev/ttyUSB1
하여 스크립트가 실패하는 Arduino가 있습니다 .
내 장치가 위치할 수 있는 모든 가능성을 열거하고 싶지는 않지만 대신 정적 위치(예: )에 바인딩하고 싶습니다 /dev/arduino
.
어떻게 이를 달성할 수 있나요?
답변1
제안된 대로 몇 가지 udev 규칙을 추가할 수 있습니다. 다음을 포함 하도록 편집했습니다 /etc/udev/rules.d/10-local.rules
.
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"
다음을 실행하여 장치의 변수를 확인할 수 있습니다.
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
더 자세한 가이드를 읽을 수 있습니다.http://www.reactivated.net/writing_udev_rules.html
답변2
위의 규칙 구문은 일부 배포판에서는 작동하지만 내 배포판(Raspbian)에서는 작동하지 않을 수 있습니다. 모든 내용을 설명하는 문서를 찾지 못했기 때문에 찾기 위해 나만의 문서를 작성했습니다.여기. 그것이 바로 그 이유입니다.
ttyUSB에 무엇이 있는지 알아보세요:
dmesg | grep ttyUSB
장치의 모든 속성을 나열합니다.
udevadm info --name=/dev/ttyUSBx --attribute-walk
(물론 x 대신 장치 번호를 사용하십시오). idVendor + idProduct와 같은 고유한 식별자 세트를 선택하세요. 동일한 idVendor 및 idProduct를 가진 여러 장치가 있는 경우 SerialNumber가 필요할 수도 있습니다. 일련번호는 각 장치마다 고유해야 합니다.
/etc/udev/rules.d/99-usb-serial.rules
다음과 유사한 줄을 사용하여 파일을 만듭니다 .SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name"
일련번호는 물론 2단계에서 찾은 idVendor 및 idProduct 번호도 필요하지 않다고 가정합니다.
새 규칙을 로드합니다.
sudo udevadm trigger
2021년 7월 6일에 수정됨:이는 당시(2015년) Archlinux 및 기타 배포판에서는 잘 작동했지만 필요할 수도 있습니다.첫 번째자동 로딩에 실패하면 를 실행하세요
sudo udevadm control --reload
.무슨 일이 일어나고 있는지 확인하세요.
ls -l /dev/your_device_name
심볼릭 링크가 가리키는 ttyUSB 번호가 표시됩니다. 그렇다면
/dev/ttyUSB1
소유자가 누구인지, 어느 그룹에 속하는지 확인하십시오.ls -l /dev/ttyUSB1
그리고 그냥 재미로:
udevadm test -a -p $(udevadm info -q path -n /dev/your_device_name)
답변3
여러 개의 동일한 USB 장치 문제
카메라가 4개 달린 라즈베리 파이가 있습니다. 사진을 찍고 fswebcam
카메라를 /dev/video0
... video3
가끔 카메라가 video0
, 로 인식했는데 vide02
, 지금은 잊어버리면 됩니다 video4
.video6
카메라 번호를 식별하려면 영구 ID가 필요하므로 video0
사진에 캡션을 추가할 때 항상 동일한 카메라가 됩니다. 불행하게도 이것은 안정적으로 발생하지 않습니다. 시작 시 카메라는 video0
... 로 열거되지만 video3
항상 같은 방식은 아닙니다.
카메라는 모두 동일한 ID와 일련번호를 가지고 있습니다.
이 문제에 대한 해결책은 udev 규칙과 관련되어 있지만 많은 문제가 있습니다.
명령을 내리면
udevadm info –attribute-walk –path=/dev/video0
많은 결과물을 얻을 수 있지만 가장 중요한 것은
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
KERNELS 비트는 USB 허브 포트입니다. 4개의 카메라에는 4개가 있습니다. 재부팅 시 변경되지 않지만 video{x}
포트와 연결됩니다.가능한변화.
따라서 비디오 번호를 USB 허브 포트에 바인딩하려면 다음과 같은 udev 규칙이 필요합니다.
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
간단해 보입니다. 카메라에 액세스하려면 다음 명령을 사용하세요.
fswebcam –d $realpath /dev/camera0
하지만 작동하지 않습니다. udev 규칙에 넣고 시스템이 video0(시작 시)을 다른 포트에 할당하면 udev 규칙이 무시됩니다. 심볼릭 링크는 /dev/camera0
기본적으로 다음과 같습니다 no such device
. 팡이.
우리가 원하는 것은 숫자가 아닌 USB 허브 주소에 심볼릭 링크를 바인딩하는 것입니다 video{x}
. Python 프로그램이 필요합니다.
첫 번째 단계는 실행하는 것입니다.
fswebcam –d /dev/video${x} tst.jpg
1에서 8 사이. 각 통화 후의 x
상태는 tst.jpg
해당 비디오 번호에 카메라가 있는지 여부를 식별합니다. 그러면 활성 비디오 번호 목록이 생성됩니다. 내 경험으로는 내가 사용한 카메라에서 0,1,2,3
작동 한다는 것입니다 .0,2,4,6
물론 다른 사람들은 이 목록을 구성하기 위해 다른 프로세스를 사용할 수도 있습니다.
그런 다음 목록의 각 비디오 번호에 대해 실행합니다.
udevadm info –attribute-walk –path=/dev/videox > dd
KERNELS= line
그 과정 에서 dd
카메라의 USB 포트 주소 목록이 생성됩니다. 다음 단계에서 항상 동일한 순서로 처리되도록 이 목록을 정렬합니다. 이것을 "주소 목록"이라고 부릅니다.
프로그램을 다시 실행 udevadm … > dd
하고 다음과 같은 목록을 만드세요.
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
이제 주소 목록을 살펴보세요. 각 항목에 대해 비디오 목록에서 해당 항목을 찾으세요. 행 모음처럼 보이는 새 목록을 만듭니다.
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
x(심볼릭 링크 번호)는 주소 목록의 시퀀스 번호로 대체됩니다.
이제 유효한 udev 규칙이 생겼습니다. 시작 시 포트에 할당된 비디오 번호에 관계없이 USB 허브 주소에 바인딩된 심볼릭 링크입니다.
최종 목록을 파일에 씁니다 /etc/udev/rules.d/cam.rules
. 실행 udevadm trigger
하여 활성화하면 작업이 완료됩니다. /dev/camera2
영상번호와 상관없이 동일한 카메라(USB 포트)가 됩니다.
답변4
에서도 독특한 장치를 발견할 수 있었습니다 /dev/serial/by-id
. 아직 재부팅을 시도하지는 않았지만 해당 디렉터리의 파일은 해당 장치 파일( ttyACM[0-9]
)에 대한 링크일 뿐입니다.
저는 Raspberry Pi에서 아치 리눅스를 실행하고 있는데 find
"Arduino"가 포함된 파일 이름을 실행하여 우연히 발견했습니다. 내 Python 프로그램은 이 파일을 내 Arduinos(지금까지 단일 Pi에 2개)에서 데이터를 읽고 쓰는 장치로 사용하여 잘 실행됩니다.