반응형

Python의 serial 모듈을 사용하여 리눅스에서 시리얼 포트 접근시 다음과 같은 에러가 발생했습니다.

 

serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyACM0

[Errno 13] Permission denied: '/dev/ttyACM0'



검색해보니 /dev/ttyACM0 시리얼 포트에 대한 접근 권한이 없기 때문이라고 합니다. 이 문제를 해결하는 몇 가지 방법을 정리해봤습니다. 



2024. 4. 10 최초작성 



1. 현재 사용자를 `dialout` 그룹에 추가하기

대부분의 리눅스 배포판에서 dialout 그룹에 현재 로그인한 사용자를 추가하면 시리얼 포트에 접근할 수 있는 권한을 부여하게 된다고 합니다. 하지만 적용해봤는데 사용중인 우분투에서는 되지 않았습니다. 



방법은 다음과 같습니다.

 

dialout 그룹에 현재 로그인한 사용자를 다음처럼 추가하고 재로그인합니다.

 

$ sudo usermod -a -G dialout $USER




2. `udev` 규칙 생성하기

`udev` 규칙을 사용하면 특정 장치에 대해 자동으로 권한을 설정할 수 있습니다. 

예를 들어, `/etc/udev/rules.d/` 디렉토리에 새 규칙 파일을 생성하여 `/dev/ttyACM0`에 대한 권한을 설정할 수 있습니다.



적용해보니 사용중인 우분투에서 시리얼 포트 권한을 얻을 수 있었습니다.



방법은 다음과 같습니다.



2-1. 99-serial.rules 파일을 다음처럼 편집모드로 엽니다. 여기에선 nano 편집기를 사용했습니다.  

 

$ sudo nano /etc/udev/rules.d/99-serial.rules



2-2.파일에 다음 내용을 추가합니다:

 

KERNEL=="ttyACM0", MODE="0666"



2-3. Ctrl + O를 누르고 엔터를 눌러  변경 사항을 저장하고 Ctrl + X를 눌러 nano 편집기를 종료합니다. 




2-4. udev 규칙을 적용하기 위해 다음 명령을 실행합니다. 

 

$ sudo udevadm control --reload-rules

$ sudo udevadm trigger




3. 임시 권한 변경

보안상 권장하지 않기 때문에 시리얼 포트에 대한 임시로 접근 권한을 부여할 때에만 사용하세요. 

 

시리얼 장치의 디바이스 파일이 /dev/ttyACM0라면 다음처럼 접근 권한을 부여할 수 있습니다.

 

$ sudo chmod 666 /dev/ttyACM0



이 방법은 재부팅 할때마다 해줘야 합니다. 





반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts