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

Der Sender

Ein Objekt der Klasse Sender ist für das Codieren von Zeichen und das Senden der zugehörigen Bytes zuständig. Damit Anfang und Ende eines Bytes erkannt werden können, wird zusätzlich ein Start- und Stoppbit mitübertragen.

import serial
import time

port = 0 # COM1

class Sender(object):
    def __init__(self, bitzeit=0.1):
        self.s = serial.Serial(port)
        self.s.setRTS(0)
        self.bitzeit = bitzeit

    def __del__(self):
        self.s.close()
        
    def schnittstelleSchliessen(self):
        self.s.close()
        
    def bitfolgeSenden(self, bitfolge):
        # Leitung auf 0 setzen fuer die steigende Flanke
        self.s.setRTS(0)
        time.sleep(self.bitzeit)
        # Startbit senden
        self.s.setRTS(1)
        time.sleep(self.bitzeit)
        # Datenbits senden
        for bit in bitfolge:
            # Datenbit senden
            if bit == '1':
                self.s.setRTS(1)
                #print('1')
            else:
                self.s.setRTS(0)
                #print('0')
            time.sleep(self.bitzeit)
        # Stoppbit senden
        self.s.setRTS(0)
        time.sleep(self.bitzeit)

    def nachrichtSenden(self, nachricht):
        for zeichen in nachricht:
            print('sende', zeichen)
            # Zeichen codieren
            zahl = ord(zeichen)
            byte = bin(zahl)[2:].zfill(8)
            # Byte senden
            self.bitfolgeSenden(byte)

Der Empfänger

Ein Objekt der Klasse Empfaenger ist für das Empfangen der Bytes und das Decodieren der Bytes zuständig. Um Anfang und Ende eines Bytes zu erkennen, befindet sich das Objekt jeweils in einem der beiden folgenden zustände.

zustandsdiagramm

Beachte, dass eine Textnachricht mit dem Zeichen # beendet werden muss, damit das Objekt der Klasse Empfaenger seine Arbeit beendet.

import serial
import time

port = 0 # COM1

class Empfaenger(object):
    def __init__(self, bitzeit=0.1):
        self.s = serial.Serial(port)
        self.s.setRTS(0)
        self.bitzeit = bitzeit
        self.zustand = 'Startbit abwarten'

    def __del__(self):
        self.s.close()
        
    def schnittstelleSchliessen(self):
        self.s.close()

    def bitfolgeEmpfangen(self, anzahlBits):
        self.zustand = 'Startbit abwarten'
        alt = self.s.getCTS()
        neu = self.s.getCTS()
        while self.zustand == 'Startbit abwarten':
            if alt == 0 and neu == 1:
                # Empfang der Daten starten
                self.zustand = 'Byte empfangen'
            else:
                # weiter Abtasten
                alt = neu
                neu = self.s.getCTS()
                time.sleep(0)
        # Bits empfangen
        bitfolge = ""
        # zur Mitte des Datenbits 
        time.sleep(self.bitzeit*1.5)
        for i in range(anzahlBits):
            if self.s.getCTS() == 1:
                #print("1")
                bitfolge = bitfolge + "1"
            else:
                #print("0")
                bitfolge = bitfolge + "0"
            time.sleep(self.bitzeit)
        return bitfolge
        
    def nachrichtEmpfangen(self):
        zeichen = None
        while zeichen != '#':
            bitfolge = self.bitfolgeEmpfangen(8)
            zahl = int(bitfolge, 2)
            zeichen = chr(zahl)
            print('empfange', zeichen)

Test des Kommunikationssystems

Die Python Shell wird auf beiden Rechnern gestartet.

In der Empfangsshell wird der Empfänger erzeugt und gestartet.

>>> e = Empfaenger()
>>> e.nachrichtEmpfangen()
...

Der Empfänger befindet sich jetzt in dem Wartezustand Startbit abwarten.

Jetzt wird der Empfänger erzeugt und aktiviert.

>>> s = Sender()
>>> s.nachrichtSenden('Hallo!#')
...

Wenn alles beim Aufbau des Systems beachtet wurde, dann wird jetzt die Nachricht übertragen.

Aufgabe 1

Probiere das selbst einmal aus.

X

Fehler melden

X

Suche