Ports benutzen (GCC)
Einleitung
Über die Ansteuerung der Schnittstellen unter Linux findet man im Internet überall etwas anderes, die einen sagen man soll die Schnittstellen über ihre I/O-Adresse (0x378,...) ansteuern.
Hier bleiben zwei Fragen offen:
- Kann ich USB-RS232 Adapter benutzen? -- Nein, USB-RS232 Adapter werden nicht über I/O-Adressen angesteuert. - Brauche ich root Berechtigung? -- Ja, ohne root Berechtigung kann man nicht auf I/O-Adressen zugreifen.
Die hier vorgestellte Methode ermöglicht folgendes:
- zugriff auf Schnittstellen ohne root Berechtigung - zugriff auf alle parallelen oder seriellen Schnittstellen, egal ob USB oder nicht - portieren des Codes auf MacOSX, freebsd, ...
Allgemein
Zugriffsrechte:
Damit man auf die Schnittstellen zugreifen kann braucht man die passende berechtigung. Auf meinem Debian System sehen die Zugriffsrechte so aus:
noway:/# l /dev/ttyUSB0 /dev/ttyS0 /dev/parport0
crw-rw---- 1 root lp 99, 0 Feb 28 16:00 /dev/parport0
crw-rw---- 1 root dialout 4, 64 Jan 22 01:11 /dev/ttyS0
crw-rw---- 1 root dialout 188, 0 Jan 22 01:11 /dev/ttyUSB0
Damit der user auf die Schnittstellen zugreifen kann, muss er in die Gruppen "lp" und "dialout" eingetragen werden.
("Bevor man auf irgendeinen IO-Port vom Userspace zugreifen kann, muss man ioperm(2) aufrufen. Dazu benötigt das Programm allerdings root- oder SUID-Root-Privilegien." <- (nicht korrekt, geht ohne))
Ich programmiere seit 7 Jahren unter Linux und anderen Unix-Systemen (in C). Mir ist noch nie aufgefallen, dass Zugriffe direkt über IO-Ports ohne einen Aufruf von ioperm(2) oder ähnlichem gehen. Wäre nämlich ne ziemliche Sicherheitslücke! Da kannst die Sicherheit gleich vergessen ...
Zugriffe über Files in /dev sind natürlich was anderes, die laufen ja auch durch den Kernel, während der Kernel bei Direktzugriffen (nach vorherigem Aufruf eben von ioperm) keine Überprüfung der Daten vornimmt!
Schnittstellen öffnen und schließen
Bevor man auf eine Schnittstelle zugreifen kann muss man diese öffnen:
int port = open( "/dev/ttyS0", O_RDWR );
Die Schnittstellen die man hier öffnen kann sind unter anderem:
- die RS-232's im system: /dev/ttyS0, /dev/ttyS1, ... - die USB-RS232's: /dev/ttyUSB0, /dev/ttyUSB1, ... - die Parallelen Schnittstellen: /dev/parport0, /dev/parport1, ...
Wenn das Programm beendet wird sollte man diese auch wieder schliessen:
close( port );
Serielle Schnittstelle
Die Serielle Schnittstelle besitzt 3 Ausgangspins (TX,RTS,CTS) und 4 Eingangspins (RX,DTR,DSR,RI).
Jetzt kann man diese Pins einzeln setzen und abfragen, oder sie als RS232 Schnittstelle benutzen.
Pins einzeln verwenden:
...
Als RS232 verwenden:
Um die Schnittstelle "normal" zu benutzen muss man:
- die Schnittstelle konfigurieren - die Daten mit read(2) lesen und mit write(2) schreiben
Konfigurieren:
...
Daten lesen/schreiben:
...
Parallele Schnittstelle
Die Parallele Schnittstelle besitzt 8 Datenleitungen und 9 Steuerleitungen, sowie 8 Massepins.
Die Datenleitungen können Bidirektional verwendet werden, die Steuerleitungen haben aber eine festgelegte Richtung.
...