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.

Verbindung mit einem Nullmodemkabel

Ü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:

Bitübertragungsprotokoll

Der Empfänger tastet die Leitung dann nach folgendem Schema ab:

Empfangen

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 1 - 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.

zustandsdiagramm

Falls Du die Bytes als Textnachricht interpretierst, kannst Du z.B. das Zeichen # als Zeichen definieren, um das Ende der Übertragung zu markieren.

Aufgabe 2 - 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 einen funktionierenden 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

s = Serial('com1')
s.setRTS(0)
while True:
    print(empfangeByte(s, 1))

# oder falls Du die empfangenen Bytes als Text interpretieren möchtest:
def empfangeText(s, bitzeit):
    zeichen = ''
    while zeichen != '#':
        byte = empfangeByte(s, bitzeit)
        zeichen = chr(int(byte, 2))
        if zeichen != '#':
            print(zeichen)

#empfangeText(s, 1)
X

Fehler melden

X

Suche