11.5 SERIELLE SCHNITTSTELLE

 

 

EINFÜHRUNG

 

Obschon für die Kommunikation zwischen einem Computer und Peripheriegeräten häufig die Bluetooth, Ethernet- oder USB-Schnittstelle eingesetzt wird, ist auch in Zukunft die Kommunikation über die serielle Schnittstelle (nach RS-232C) manchmal die bessere Lösung, da der schaltungstechnische Aufwand beim Peripheriegerät kleiner ist. Darum wird die serielle Schnittstelle immer noch zum Anschluss von Messgeräten (Voltmeter, Kathodenstrahl-Oszillografen, usw.), zur Steuerung von Apparaten und Robotern und zur Kommunikation mit Microcontrollern eingesetzt. Moderne Computer besitzen zwar keine serielle Schnittstelle mehr, mit preisgünstigen USB-Serial-Adaptern kann dieser Mangel aber leicht behoben werden.

Für das Verständnis der seriellen Schnittstelle ist es wichtig zu wissen, dass es je eine Datenleitung für das Senden und Empfangen der Daten (TD/RD), zwei Paare von Handshake-Leitungen RTS/CTS bzw. DTR/DSR, zwei Statusleitungen CD/RI und einen Ground gibt. Vom Computer aus gesehen sind die Leitungen TD, RTS, DTR Ausgänge, die Leitungen RD, CTS, DSR, CD, RI Eingänge. RTS und DTR können also programmgesteuert aktiviert und deaktiviert werden, CTS, DSR, CD und RI können nur gelesen werden.

Anschlüsse beim 9-poligen RS-232-Stecker

Das Format der übertragenen Daten ist einfach. Es werden zeitlich hintereinander Datenbytes übertragen. Die Übertragung beginnt mit einem Startbit, das den Empfänger auf die bevorstehende Datenübertragung aufmerksam macht. Es folgen die Daten selbst, die 5, 6, 7 oder (gewöhnlich) 8 bits umfassen. Um eine Fehlerkorrektur zu ermöglichen, folgt nachher ein Paritätsbit, das angibt, ob im aktuell übertragenden Datenbyte eine gerade oder ungerade Zahl von Datenbits gesetzt sind, wobei das Paritätsbit auch entfallen kann. Die Übertragung wird mit einem oder zwei Stopbits beendet. Das sendende und empfangende Gerät sind nicht miteinander synchronisiert, d.h. die Datenübertragung kann irgend einmal beginnen und wieder enden. Immerhin ist es nötig, dass die beiden Geräte dieselbe zeitliche Dauer eines einzelnen Bits vereinbaren. Diese wird durch die Baudrate (in baud, bits/s) angegeben und kann in der Regel nur die standardisierten Werte 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 baud annehmen. Die beiden Geräte können zudem noch ein Handshake (flow control) vereinbaren, mit dem sie einander mitteilen, ob sie für den Datentransfer bereit sind. Man unterscheidet zwischen Hard- und Software-Handshake, je nachdem ob die Handshake-Leitungen benützt oder ob der Handshake mit speziellen ASCII-Zeichen (XON/XOFF) erfolgt, die in den Datenstrom eingebettet werden.

Eine typische Port-Konfiguration umfasst daher: Baudrate, Anzahl Datenbits, Anzahl Stopbits, Parity none, odd or even, Handshake none, hard- oder software.

Spannungsverlauf bei der Übertragung des Buchstabens 'B', mit der Konfiguration 7 databit/no parity/1 stopbit

 

 

INSTALLATION

 

Die hier beschriebene Verwendung des Moduls pySerial funktioniert unter einem 32- oder 64-bit Betriebssystem, allerdings nur mit einem 32-bit-Java Runtime Environment (JRE). Man kann dieses von hier downloaden. Folgende weitere Installationsschritte sind nötig (Lib ist ein Unterverzeichnis des Verzeichnisses, in dem sich tigerjython2.jar befindet):

1.

Download von pyserial.zip. Auspacken und ganze Verzeichnisstruktur in das Verzeichnis Lib kopieren

<tigerjythonhome>
    Lib
        Serial
            tools
            urhandler

2. Download von javacomm.zip. Auspacken und comm.jar in Lib kopieren.

3. (Unter Windows): Aus javacomm.zip die Datei win32com.dll in c.\windows\system32 kopieren. Unter c:\Program Files (x86) findet man das Verzeichnis Java und das Homeverzeichnis der JRE. Aus javacomm.zip die Datei javax.com.properties in das Unterverzeichnis lib kopieren. (Achtung: Bei Updates der JRE geht diese Datei eventuell verloren.)

4. Falls nötig, den Treiber des verwendeten USB-Serial-Adapters installieren. Adapter anschliessen und  in den Adapter-Eigenschaften (im Geräte-Manager) den verwendeten COM-Port herausfinden/neu setzen, z.B. COM1.

5. Test der Installation durch Ausführen von PortEnumerator.jar (aus javacomm.zip). Der Com-Port muss angezeigt werden.

EINFACHES TERMINAL

Du solltest dich vorerst etwas in der Dokumentation von pySerial umsehen. Du findest auf https://github.com/pyserial/pyserial unter pySerial API eine vollständige Beschreibung der Klassen. Einige davon sind allerdings plattformspezifisch. Mit deinem Programm kannst du Zeichen, die auf der Tastatur eingegeben werden, zeichenweise an einen externen Device senden und von ihm empfangene Zeichen in einer Konsole ausschreiben. Es handelt sich also um die einfachste Form eines Terminal-Emulators.

Zum Test kannst du entweder zwei Computer über eine Link-Kabel, das insbesondere RD (Receive Data) und TD (Transmit Data) vertauscht, miteinander verbinden und auf beiden das Programm laufen lassen. Du kannst auch nur diese beiden Pins miteinander verbinden (mit einer Klammer oder ähnlichem Gegenstand kurzschliessen). Dann werden alle gesendeten Zeichen sofort wieder empfangen.

import serial
from gconsole import *

makeConsole()
setTitle("Terminal")
ser = serial.Serial(port = "COM11", baudrate = 115200, timeout = 0)
while not isDisposed():
    key = getKey()
    if key != "":  # a key is typed
        if ord(key) == 10: # cr key pressed
            key = "\r"
        ser.write(key)
    nbChars = ser.inWaiting()   
    if nbChars > 0:
        text = ser.read(nbChars)
        for ch in text:
            if ch == '\n':
                gprintln()
            else:   
                gprint(ch)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Zum Lesen der empfangenen Zeichen musst du eine nicht-blockierende Funktion verwenden, da ja das Programm auch laufend prüfen muss, ob eine Taste gedrückt wurde. Die Methode ser.read() blockiert nicht, wenn du im Konstruktor den timeout-Parameter auf 0 setzt.

Falls du ein Notebook mit einem eingebauten Modem hast, so kann das Terminalprogramm mit diesem Hayes-Befehlen mit ihm kommunizieren.