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):
EINFACHES TERMINALDu 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)
|
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. |