home sitemap

1. Die serielle Schnittstelle


zurück zum Inhaltsverzeichnis

Grundlagen zur seriellen Schnittstelle:
Die serielle Schnittstelle häufig auch als COM-Port oder früher nach ihrem Standard RS232-Schnittstelle genannt, ist eine Schnittstelle mit 25 Anschlüssen, wobei diese Anschlüsse, von der Steckeraussenseite eines Kabels betrachtet, durchnummeriert sind (siehe Abbildung 1 und siehe Kabelstecker). Es gibt von der seriellen Schnittstelle auch eine abgespeckte Variante, sie hat nur 9 Pins und genügt dem Verbinden von Computern (Nullmodem-Kabel), Modems, früher die Maus usw. Diese 9Pin-COM-Ports werden heute auf den Motherboards verbaut. Hingegen waren noch vor einigen Jahren die seriellen Schnittstellen - auch eine große - auf "Controllerkarten" untergebracht. Wenn man heute wiederum von Controllerkarten spricht, dann werden i.d.R. SCSI, RAID, FW oder Multi I/O Karten gemeint (letztere siehe Kapitel 5).

Bei der seriellen Schnittstelle wird nur ein Kabel zur Datenübertragung in eine Richtung benutzt, d.h. diese Schnittstelle sendet und empfängt die Daten in einem seriellen Bit-Strom, wobei den 8 Bits noch weitere Bits zu einem Datenpaket hinzugefügt werden (Start,Daten,Parität,Stop). Die einzelnen möglichen Signaländerungen dieses seriellen Bit-Stroms werden pro Sekunde in Baud angegeben. Ohne Signalverstärkung sind deutlich über 100m Verbindungslängen möglich. An der seriellen Schnittstelle liegen Pegel von - 12V bis +12V (bipolar), wobei -12V bis ca. +2V als kein Signal, +2V bis +3V gar nicht und +3V bis 12V als Signal begriffen wird. Die Ausgänge haben eine Leistung von ca. 10mA und alle Pins sind gegen Überlastung geschützt.

Die serielle Schnittstelle zum Messen und Steuern:
Es soll im folgenden gezeigt werden, wie die serielle Schnittstelle selbst dem Roboterbau dienen kann. Dabei sind nicht die Interfaces gemeint, die an die serielle Schnittstelle angeschlossen werden können (hierzu siehe Kapitel 6). Auch sind hier nicht die WebCams gemeint, mit denen ein Roboter Sehen lernt, da diese über einen Treiber angesprochen werden können (siehe Kapitel 7).


Abbildung 1:

Die Abbildung 1 zeigt den Stecker eines seriellen Kabels von vorne, nicht von der Kabelseite und auch nicht den Stecker am Computer, sondern den Stecker, der in den Computer gesteckt wird!

Gelb sind alle Eingänge, rot alle Ausgänge und grün ist die Masse. "E" ist die Empfangsleitung und "S" ist die Sendeleitung. Die anderen gelben und roten Leitungen haben Funktionen, die der Kummunikation über "E" und "S" dienen.

Die Funktion des Steckers soll mit einem Beispiel erklärt werden:
Das "Handshake" zwischen Computer und Modem beschrieben zum 9 Pin Stecker.
Der Computer gibt 12V auf Pin 7 (RTS: Request To Send, "Bitte senden zu dürfen") an das Modem. Das Modem reagiert, wenn es bereit ist, mit 12V auf Pin 8 (CTS: Clear To Send, "bin bereit zu empfangen") - alle Pins siehe Abbildung 1. D.h., wenn ein Programm das RTS - Signal aktiviert und auf das CTS - Signal wartet, dann führt es ein "Handshake" aus! D.h. aber auch, das ein Schalter die 12V von Pin 7 zurück auf Pin 8 schalten kann. Fertig ist das Auslesen eines digitalen Schalters.

So - weiter mit dem vereinfachten Computer / Modem Beispiel:
Der Computer bemerkt dann das RTS - Signal und sendet die Daten über Pin 3 (TD:Transfer Data, "Daten senden") wobei das Modem, beim Empfang der Daten 12V auf Pin 1 (DCD: Data Carrier Detect, "ich bekomme gerade Datentägersignal") gibt- alle Pins siehe Abbildung 1. D.h., Pin 1 könnte ein Eingang für einen digitalen Schalter sein.

Das Modem zeigt dem Computer durch 12V auf Pin 6 (DSR: Data Set Ready, "Modem: bin bereit"), daß es für eine Verbindung zum Computer bereit ist. D.h., Pin 6 könnte ein Eingang für einen digitalen Schalter sein.

Der Computer zeigt dem Modem durch 12V auf Pin 4 (DTR: Data Terminal Ready,"Computer: bin bereit), daß er für eine Verbindung zum Modem bereit ist. D.h., Pin 4 könnte als Ausgang einen digitalen Schalter speisen oder einen Motor antreiben.

Wird das Modem von außen angewählt, so gibt es 12V auf Pin 9 (RI: Ring Indicator, "Anruf"). Dies wäre ein Eingang.

Letztlich fehlen noch Pin 2 (RD: Receive Data, "empfange Daten"), Pin 5 (GND; Ground, "Masse") und Pin 3 (TD:Transfer Data, "Daten senden").
Zum Pin 2: Diesen habe ich bis jetzt noch nicht als Eingang von Steuersignalen genutzt bekommen.
Zum Pin 3: Wenn man das Register dieses Pins mit einer Variation von Bit-Kombinationen "beschießt", dann findet man das Bit 6, welches scheinbar ein Bit für Fehler ist, wenn der Bitstrom zwischen Computer und Modem abreißt. Mit diesem Bit 6 wird die Datenleitung zu einer Hilfsleitung der Kommunikation, da damit der Computer dem Modem den Kommunikationsfehler anzeigt. Dies wäre dann der dritte Ausgang der seriellen Schnittstelle.
zum Pin 5: Der Pin 5 bietet die Masse, sie ist immer da!

Zusammenfassung:
- Die mit "E" markierte Leitung bleibt außen vor, jedenfalls erst einmal.
- Eine serielle Schnittstelle hat damit 3 digitale Ausgänge, 4 digitale Eingänge sowie 1 Masse.

Die meisten Computer haben 2 dieser Schnittstellen bzw. lassen sich ohne großen Aufwand noch 2 zusätzliche einbauen! Damit lassen sich Schalter anschließen (gelb und rot) oder Motoren, Dioden usw. steuern (grün und rot). Bei Motoren muß die Leistungsaufnahme beachtet werden (siehe oben Grundlagen). U.U muß der Motor separat mit Strom versorgt werden - jedenfalls ein starker - und die serielle Schnittstelle übernimmt nur das Schalten des separaten Stromes.


Abbildung 2: 9-Pin-Stecker ohne Kabel von vorne (links) und hinten
Wird er in die serielle Schnittstelle am Computer gesteckt, kann man die Pins (E1, E6, E8, E9, A3, A4, A7 und M5) wie oben beschrieben nutzen.

Wichtig ist, die serielle Schnittstelle schaltet beim Booten des Computers einige Ausgänge an. D.h., werden Motoren gesteuert, so sollten diese durch einen Schalter abschaltbar sein.

Zur Programmierung der seriellen Schnittstelle:

Die serielle Schnittstelle wird über ihre Adresse im Computer angesprochen. Folgende Standard-Adressen können für die seriellen Schnittstellen gelten:
COM1 $3F8
COM2 $2F8
COM3 $3E8
COM4 $2E8
Welche Adresse tatsächlich benutzt wird, zeigt die Systemsteuerung.
In dieser Adresse befindet sich das erste Byte der jeweiligen seriellen Schnittstelle. Die folgenden Bytes werden nach ihrem Abstand zur Adresse mit OFFset benannt, d.h., ist die Adresse 3F8, so liegt das 2. Byte bei einen OFFSet=1 ($3F9), das 3. Byte bei einem OFFset=2 ($3FA) usw. [beachte hexadezimal nicht dezimal, sprich (hex)0..9,a..f = (dez)0..15].
Die einfachste Methode die Belegung der einzelnen Register (Bytes) und deren Auswirkungen herauszufinden, ist der Bau zweier Teststecker (siehe unten) und das "Beschießen" der Bytes an den jeweiligen Adressen plus OFFsets mit Werten von 0..255 (8Bit). Sicherlich gibt´s dazu auch passende Fachliteratur und Beiträge im WWW, jedoch ist der hier beschriebene Weg sehr einfach und schnell zu verwirklichen. Es kann aber keine Haftung für Schäden, welche beim Eigenversuch entstehen, übernommen werden.

Beim "Beschießen" habe ich folgende Eigenschaften bzw. Auswirkungen der Register gefunden:

Die Schnittstellen:
Sollte der Teststecker beim "Beschießen" nichts anzeigen und das Programm macht keine Fehlermeldung, dann muß die Schnittstelle geöffnet werden [in dephi mit "CreateFile"]!

Ausgänge (PIN 3, 4, 7):
1. PIN 3 liegt auf Adresse+3 und schaltet sich erst ein, wenn ins Byte ein Wert von 64 geschrieben wird. D.h., wenn von den 8 Bits (1..8) das 7. von null auf eins wechselt.
2. Das Register (Adresse+4) ist für die Ausgänge am PIN 4 und 7 verantwortlich, wobei ein Wert 0 beide ausschaltet, ein Wert von 1 nur PIN 4 anschaltet, ein Wert von 2 nur PIN 7 einschaltet und ein Wert von 3 beide anschaltet. D.h., soll nur ein Ausgang von diesen beiden geschaltet werden und der andere soll unverändert bleiben, so muß erst dieses Register ausgelesen werden, um dann per Logik den entsprechenden Wert ins Register zu schreiben.
3. Wird ins Register (Adresse+3) etwas geschrieben, so verändert sich auch das Register (Adresse+4). D.h., man muß erst das Register (Adresse+4) zwischenspeichern, dann das Register (Adresse+3) beschreiben und danach das Register (Adresse+4) zurücksichern.

Die Eingänge (PIN 1, 6, 8, 9):
1.Alle diese Eingänge haben das Register (Adresse+6), d.h., alle diese vier Eingänge werden über ein Byte gesteuert. Dabei sprechen folgende Werte die PINs an: PIN 1 = 128, PIN 6 = 32, PIN 8 = 16 und PIN 9 = 64
Nur gibt es bei vier PINs auch 16 Kombinationen im Byte. Also erst das Register abfragen, Wert merken und per Logik den Wert verändern und erneut ins Register schreiben: Ist z.B. PIN 1 und PIN 9 an, so hat das Register den Wert 192, soll nun PIN 8 auch eingeschaltet werden, dann muß 206 ins Register geschrieben werden.

Es haben sich schon viele Autoren mit den Schnittstellen auseinandergesetzt (siehe Delphi-Links). Die mir bekannten Quelltexte zeugen i.d.R. von enormen Programmierfähigkeiten, da eindrucksvoll gezeigt wird, wie die Schnittstelle in Delphi zu handeln ist. Diese "Portschreiber" sind jedoch i.d.R. zur Ansteuerung der Schnittstelle für alles mögliche gedacht. Hier soll gezeigt werden, wie man die serielle Schnittstelle zum Messen und Steuern direkt nutzen kann.

Was früher in DOS - Zeiten leicht über den Port Befehl zu realisieren war, ist heute in Delphi etwas komplizierter. Jedoch steht der Weg über den Assembler-Code immer noch offen.
In Delphi kann durch einen "asm ... end;"-Block ein Assembler-Programm eingebunden werden. Folgende wenige Zeilen, welche kommentiert sind, zeigen zuerst, wie ein Wert ins Register einer Schnittstelle geschrieben und danach wie er gelesen wird, jedoch muß die Schnittstelle erst geöffnet werden (siehe oben):

var
Port:DWord; //Adresse+OFFset
Wert:DWord; //Wert, der in Port geschrieben oder von Port gelesen werden soll

asm // leitet ein Assembler - Programm in Delphi ein
mov edx, Port; // lade Port in edx
mov eax, Wert; // lade Wert in eax
out dx, eax; // schreibe "Wert in Port"
end;// beendet ein Assembler - Programm in Delphi

asm
mov edx, Port;
in al, dx; // lese "Wert von Port"
mov Wert, eax ; //lade "Wert in Wert"
end;

Dieser Maschinencode eignet sich gut für das sogenannte Polling, wobei das Steuerprogramm die Schnittstelle abfragt. Hingegen kann sich die serielle Schnittstelle, da sie einen Interrupt hat (Standard IRQ 4 für die COM1 und IRQ3 für die COM2, siehe eigene Systemsteuerung), auch beim Steuerprogramm melden. Da diese Punkt gerade bearbeitet wird, muß ich ihn nachreichen.

Teststecker:
Bei der Programmierung der DLL habe ich folgende Stecker gebraucht, um zum einen die Lage der Steuerbits und deren Bedeutung zu finden bzw. zu testen und zum anderen, um die DLL zu überprüfen:


Abbildung Teststecker - Eingänge:
Dieser Stecker verbindet die drei Ausgänge mit den vier Eingängen (A3 mit E1 und E9, A4 mit E6, A7 mit E8).Die Masse (PIN 5) und Read Data (Pin 2) sind ungenutzt.


Abbildung Teststecker Ausgänge:
Dieser Stecker verbindet die drei Ausgänge (PIN 3, 4 und 7) jeweils mit einer Diode incl. Widerstand und diese mit der Masse (PIN 5). Die restlichen Pins sind ungenutzt.

Der Inhalt der Absätze "Zur Programmierung der seriellen Schnittstelle" ist komplett in einer DLL umgesetzt worden. Sie beinhaltet alle Befehle zum öffnen, schreiben und lesen der seriellen Schnittstelle sowie die Logik dahinter, daß alle PINs unabhängig gesteuert werden können. Zur PSseriDLL siehe Programmbereich.

Kleiner Roboter:
Als Beispiel zur Nutzung der seriellen Schnittstelle soll ein "kleiner Roboter" dienen, wenn man dazu schon Roboter sagen kann.


Abbildung 3: Kleiner Roboter

Der kleine Roboter ist in eine Schachtel (3*5*7 cm / H*B*T) eingebaut. Er hat einen 9Pin Stecker für die serielle Schnittstelle, eine Diode mit Widerstand (Schutz der Diode vor 12V) und einen Schalter. Damit verfügt der kleine Roboter über eine Schnittstelle zum Computer, über einen Schalter, den man messen kann, und über eine Diode, die gesteuert werden kann.

Das Innenleben des kleinen Roboters ist nach dem o.g. Beispiel aufgebaut. Der Schalter bildet das "Handshake" nach, er verbindet Pin 7 mit Pin 8. Die Diode ist am anderen Ausgang Pin 4 und bezieht die Masse über Pin 5 siehe Abbildung 4.

Ich übernehme keine Haftung für Schäden, die beim Nachbau des kleinen Roboters entstehen!


Abbildung 4: Innenleben

Zur Steuerungssoftware siehe Programmbereich.

Motorsteuerung:

Im Programmbereich ist ein Beispiel für eine Motorsteuerung enthalten. Dieses Beispiel ist für die parallele Schnittstelle geschrieben worden. Es läßt sich sehr einfach für die serielle Schnittstelle umschreiben. Was geändert werden muß ist im Quelltext kommentiert.

Exkurs: Teile für den kleinen Roboter

Wenn man die Kleinteile einkauft, wird man schnell merken, daß die Summe der Kleinteile oft im Betrag größer ist - als vermutet. Häufig sind jedoch schon viele Kleinteile (Stecker, Kabel usw.) vorhanden, da einige Geräte mit seriellen Kabeln ausgeliefert werden und man eigentlich nur 1-2 Kabel in Reserve braucht.

Was befindet sich in so einem seriellen Kabel?

- 1 weiblicher und ein männlicher Stecker
- u.U. 2 Kabelhalter
- 9 verschiedene Leitungen
- 2 kleine Gehäuse
- Isoliermaterial

Was würde für den kleinen Roboter noch fehlen?
- eine Diode und ein Widerstand sowie ein kleiner Schalter

Exkurs: Kabel

Im Grunde gibt es zwei Arten von seriellen Kabeln, die einen sind 1 zu 1 verdrahtet und haben einen männlichen und einen weiblichen Stecker, mit ihnen schließt man in der Regel Geräte an den Computer, die anderen haben zwei weibliche Stecker und sind nicht 1 zu 1 verdrahtet, mit ihnen werden z.B. zwei Computer verbunden (Nullmoden-Kabel). Soll ein Roboter mit einem Nullmodelkabeln verbunden werden, so muß auf die sich ändernde Pin-Belegung geachtet werden.



weiter zum Kapitel 2: Die parallele Schnittstelle