GNU/Linux: Fehlermeldung 'error opening serial port', 'avrdude: ser_open(): can`t open device <port>', 'permission denied'

Was tun, wenn man unter GNU/Linux keinen Zugriff auf den seriellen Port/USB erhält?

Sind die Zugriffsrechte auf Gerätedateien (serielle Ports, USB) unter GNU/Linux nicht passend gesetzt, kann der Benutzer einen Mikrocontroller weder programmieren noch die Mining-Software 'AVR_Miner.py' nutzen.

Wer das erste Mal einen Arduino UNO mit der Arduino IDE programmieren will, stolpert unter GNU/Linux fast immer über das Problem, dass die IDE keinen Zugriff auf den serielle Port (also USB) hat und so den Mikrocontroller nicht findet. Die Lösung: Korrekte Gruppenzugehörigkeit (und nicht wie oft beschrieben Gerätedateien für alle/jeden freigeben!).

Zugriff auf serielles USB

Die Arduino IDE funktioniert "out of the box"- bis auf eine Ausnahme: Man kann nicht schreibend auf die seriellen Ports und damit auch nicht auf USB-Geräte zugreifen. Das ist eine sinnvolle Sicherheitseinstellung in Unix-Systemen wie Linux oder den BSDs. Linux folgt (zumindest noch teilweise) der Philosophie von Unix: "Alles ist eine Datei", weswegen auch USB-Geräte als Dateien im Verzeichnisbaum abgebildet werden. Steckt man einen Arduino UNO an einen USB-Port, erscheint er als Datei im /dev-Verzeichnis:

mipl@t5500:~$ ls -l /dev/ttyACM* /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 14. Feb 09:03 /dev/ttyACM0

Was bedeuten die Angaben in der zweiten Zeile?

  • crw-rw---- Zugriffsrechte für UGO (User "rw", Group "rw", Others "--")
  • root dialout Die Datei/das Gerät gehört root und der Gruppe dialout
  • 14 Feb 09:03 Zu diesem Zeitpunkt wurde die Datei erstellt (Arduino eingestöpselt).
  • /dev/ttyACM0 Der Name der Datei, über den auf den Arduino UNO zugegriffen werden kann
Übrigens: Originale Arduino UNO/Nano melden sich als /dev/ttyACMx am System an, Clones hingegen als /dev/ttyUSBx.

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

Screenshot Arduino IDE Fehler 13

Sollte es eine Fehlermeldung beim Zugriff auf den seriellen Port (USB-Port /dev/ttyACM0 bei originalen Arduino UNO, /dev/ttyUSB0 bei Clones), fehlen dem Benutzer die Rechte für den Zugriff auf dieses Gerät/diese Datei. Man sollte auf keinen Fall wie oft angegeben die Gerätedatei dem Benutzer zugehörig machen (chown ttyACM mipl:mipl) oder gar die Zugriffsrechte für alles und jeden freigeben (chmod 777 ttyACM0). Das ist extrem unsicher und dumm. Statt dessen muss der Benutzer der Gruppe "dialout" (für Moden- und damit serielle/USB-Zugriffe) beitreten. Das muss mit root-Rechten erfolgen und sieht so aus:

sudo usermod -a -G dialout mipl

Hierdurch wird "mipl" zusätzlich in die Gruppe dialout aufgenommen. Mit "-a" wird die angegebene Gruppe hinzugefügt (ohne "-a" wäre "dialout" anschließend die einzige Gruppe). Hinter "-G" werden alle Gruppen (mehrere werden durch Komma getrennt) aufgelistet, denen der Benutzer beitreten soll.

Gibt man nun noch einmal den id-Befehl ein, sieht man, dass der Benutzer der Gruppe dialout hinzugefügt wurde. Als Benutzer sieht man diese Gruppenzugehörigkeit aber noch nicht. Lästigerweise muss man sich neu anmelden oder das System neu starten, damit die Änderung für die aktuelle Sitzung wirksam wird.

In der Standardinstallation ist man nicht Mitglied der Gruppe dialout. Dieser Gruppe ist es erlaubt, auf serielle Schnittstellen zuzugreifen (dialout = herauswählen, stammt aus Zeiten der Datenübertragung per Modem).

Nach einem Neustart zeigt der Aufruf von id, dass man nicht root ist (man sollte niemals als root arbeiten, egal unter welchem Betriebssystem), aber der Gruppe dialout angehört:

mipl@t5500:~$ id
uid=1000(mipl) gid=1000(mipl) Gruppen=1000(mipl),24(cdrom),25(floppy),
29(audio),30(dip),44(video), 46(plugdev),102(netdev)

Jetzt kann man Mikrocontroller über die Arduino IDE (oder avrdude) programmieren und den Arduino UNO per

python3 AVR_Miner.py

Duinocoin (DUCO) schürfen lassen.