Ein einfacher Sender und Empfänger
Verbindung der seriellen Schnittstellen
Wir gehen hier wieder von der folgenden Situation aus, bei der die seriellen Schnittstellen von zwei Rechnern mit einem Nullmodemkabel miteinander verbunden sind.
Übertragen von Bytes
Acht Bits fasst man meistens zu Paketen von einem Byte zusammen. Auch wir wollen das hier so machen, sodass die kleinsten Datenpakete, die übertragen werden sollen, aus je einem Byte bestehen. Aus den vorherigen Abschnitten weißt du, dass man das zu verschickende Paket mit einem Startbit markieren muss. Ergänzt man zusätzlich noch ein Stoppbit, hat das zu sendende Datenpaket folgende Form:
Der Empfänger tastet die Leitung dann nach folgendem Schema ab:
Aufgabe 1 - Bitübertragungsprotokoll
Beschreibe das Protokoll zur Übertragung eines Byte. Erkläre die Notwendigkeit des Start- und des Stoppbits. (Tipp zur Notwendigkeit des Stoppbits: Was würde auf Empfängerseite passieren, wenn man das Stoppbit wegließe und das nächste Byte sofort geschickt würde? Bedenke, dass es in echten Systemen immer zu kleinen Verschiebungen kommen kann.)
Der Sender
Ein Sender muss also nach dem oben definierten Protokoll ein Startbit, acht Datenbits und ein Stopbit senden. Dies wird für jedes zu sendende Byte wiederholt.
Aufgabe 2 - Sender implementieren
Ergänze die unten dargestellte Funktion sendeByte
und teste sie z.B. mit dem LED-Anzeigegerät (ohne einen anderen Rechner)
oder mit dem Universaltransceiver (an einem anderen Rechner).
Möchtest Du Texte versenden, kannst Du die vorgegebene Funktion sendeText
benutzen.
(Achtung: Funktioniert so nur für Zeichen nach ISO 8859-1)
from serial import *
from time import *
def sendeByte(ser, bitzeit, bitfolge):
# Sende Startbit, Datenbits und Stopbit
def sendeText(s, bitzeit, text):
for zeichen in text:
bitfolgeBuchstabe = bin(ord(zeichen))[2:].zfill(8)
sendeByte(s, bitzeit, bitfolgeBuchstabe)
s = Serial('com1')
# Bei manchen Systemen muss RTS nach dem Öffnen der Schnittstelle explizit auf 0 gesetzt werden.
s.setRTS(0)
sendeByte(s, 1, '01010011')
#sendeText(s, 1, 'Hi')
Der Empfänger
Der Emfpänger tastet die Leitung in relativ kurzen Intervallen ab. Er wählt dabei eine kürzere Zeit als die Bitzeit, wartet aber zwischendrin immer kurz ab, um den Rechner nicht unnötig zu blockieren. Um Anfang und Ende eines Bytes zu erkennen, befindet sich der Empfänger jeweils in einem der beiden folgenden Zustände.
Aufgabe 3 - Empfänger implementieren
Ergänze die Funktion empfangeByte
und teste sie, indem Du von einem anderen Rechner
Daten empfängst. Du kannst auf dem anderen Rechner den von Dir programmierten Sender oder den
Universaltransceiver benutzen.
from time import *
from serial import *
def empfangeByte(s, bitzeit):
# warte auf Startbit
# Frage acht mal die Leitung ab und warte eine Bitzeit
# Gebe Bitfolge zurück, z.B. '01000001'
def empfangeText(s, bitzeit):
while True:
byte = empfangeByte(s, bitzeit)
zeichen = chr(int(byte, 2))
print(zeichen)
# Testprogramm initialisieren
s = Serial('com1')
s.setRTS(0)
# Test entweder mit Rohdaten
#while True:
# daten = empfangeByte(s, 1)
# print(daten)
# oder teste mit Text
#empfangeText(s, 1)