Hallo ihr Lieben, ich habe grad irgendwie ein Verständnisproblem. Wie kann man denn das Stopbit von einem Pegelwechsel innerhalb des Datenbytes erkennen? Wie erkenn ich zum Beispiel bei einem Datenbyte von 0b01010101 ein Stopbit??? Es handelt sich dabei um 8N1 Vielen Dank schon mal. Gruß micha
Hallo Micha, die Datenübertragung bei RS232 erfolgt nicht über Pegelwechsel, sondern über die Pegel selbst, die deshalb immer zur rechten Zeit da sein müssen. Es ist nur ein Pegelwechsel nötig, damit der Empfänger seine "Uhr" am Anfang danach synchronisieren kann, nur dafür sorgen Start und Stoppbit. Gruß, DetlevT
wenn du nur den Datenstrom hast überhaupt nicht. Aber meist macht der Sender ja kurz eine pause. Und nach einer Pause kommt immer ein Start Bit.
An einem Pegelwechsel kannst du bei UART-Übertragung rein weg gar nichts erkennen (ausser dem Beginn des Startbits). Dort wird der Empfänger synchronisiert, ab da gibt die Zeit die Abtastzeitpunkt vor (Baudrate). Und da man eben aus den Pegelwechseln nichts erkennen kann, füllt das Thema 10% der Beiträge hier: Sender und Empfänger müssen mit möglichst gleichem Takt arbeiten.
Die Datenübertragung der RS232 hat immer ein bestimmtes Datenformat: Startbit - Datenbits - Stopbit. Die Anzahl der Datenbits kann man variieren, wobei sie dem Sender und dem Empfänger bekannt sein müssen. 8N1 heisst ja nichts anderes als, dass die Übertragung aus insgesamt 10 Bits besteht. Das Startbit erkennt man an einer Flanke (welche Richtung, weiß ich gerade nicht; vermutlich fallend). Die restlichen Bits zählt man dann einfach. Wenn der Empfänger nicht schon lief und eine Übertragung mitten im Byte empfängt, dann empfägt er Mist. Dazu gibt es dann Protokolle, die eine entsprechende Fehlererkennung besitzen, eine Ebene über der eigentlichen Schnittstellen-Kommuunikation.
Mir gehts nicht um den Pegelwechsel an sich. Das Problem hat Peter sich richtig erkannt, wie mir scheint. Wenn ich Das Start-Bit erkennen will (Soft-UART) und schalte meinen Controller im Moment einer momentanen Übertragung ein, erkenne ich ja dann auch irgendwelche low-Bits im Datenbyte als Start-Bit, oder? Ist die "Ruhezeit" irgendwo definiert?
Sicher kann man davon ausgehen das bei 8N1 nach 9 0-Bits und dann einer 1 das die 1 das Startbit ist.
Ganz einfach, Startbit ist vor dem Stopbit. Und hat noch eine andere Flanke. Also nach dem Startbit die Datenbits abzählen, evtl Parity mitzählen und dann kommt das Stopbit
Micha R. wrote:
> Ist die "Ruhezeit" irgendwo definiert?
Nein.
Du hast das schon richtig erkannt. Wenn du in den Pegelstrom einer
Leitung mittendrinn einsteigst, gibt es keine Möglichkeit eindeutig zu
sagen: Hier beginnt das nächste Byte.
Wenn der Sender nicht regelmässig eine kleine Pause einlegt, empfängst
du nur Mist.
Das Stoppbit an sich ist nur für den Sender interessant. Der Empfänger
wertet es nicht aus. Praktisch gesehen zwingt die Anzahl der Stoppbits
den Sender dazu, nach der Übertragung aller Bits eine kleine Pause
einzulegen (aber nicht falsch verstehen. Diese Pause ist zu kurz um
damit eine Synchronisierung zu erreichen). Die Idee dahinter war wohl,
dem Empfänger ein klein wenig Zeit vor dem nächsten Byte zu verschaffen,
damit er das eben empfangene Byte verarbeiten kann.
Muss ich denn dann immer davon ausgehen, dass in so einem Fall immer nur Mist empfangen wird?
ja, passiert sogar bei Hardware UART. Du kannst dann nur "raten" wenn also das Stopbit nicht 0 ist dann, fange wo anders an. Nach genug daten und einen gescheiden algo sollte man es ermitteln können.
Karl heinz Buchegger wrote: > Das Stoppbit an sich ist nur für den Sender interessant. Der Empfänger > wertet es nicht aus. Klar tut er das (sollte es zumindest). Wenn der Empfänger im Bereich des(der) Stoppbit(s) einen Low-Pegel findet, gibt es einen Framing-Error. > Die Idee dahinter war wohl, > dem Empfänger ein klein wenig Zeit vor dem nächsten Byte zu verschaffen, > damit er das eben empfangene Byte verarbeiten kann. Sicher? Ich denke es geht eher darum, das nächste Startbit erkennen zu können. Die Kombination aus Stop- und Startbit garantiert, dass ein Zeichen immer mit einer Low-Flanke beginnt.
Karl heinz Buchegger wrote: > Die Idee dahinter war wohl, > dem Empfänger ein klein wenig Zeit vor dem nächsten Byte zu verschaffen, > damit er das eben empfangene Byte verarbeiten kann. Nein, das Stopbit erzwingt, dass das nächste Startbit einen Pegelwechsel verursacht. Auf diesen Pegelwechsel synchronisiert sich der Empfänger neu. Damit summiert sich ein Baudratenfehler nur innerhalb der Bits eines Zeichens, aber nicht über die Grenzen des Zeichens hinaus. Beim mechanischen Fernschreiber hat das Stopbit in der Tat den Decoder angehalten (mechanisch). Die Flanke des Startbits hat ihn dann über einen Magneten wieder freigegeben. Ja, die Baudot- Kodierung wurde damals wirklich komplett mechanisch abgetastet. ;-) Aus diesen Zeiten dürfte es auch stammen, dass man anfangs zwei, später 1,5 Bitzeiten für das Stopbit benutzt hat: andernfalls riskiert man, dass bei leichter Differenz der Baudraten (d. h. der Drehzahl der Motorwellen) der Empfänger noch nicht wieder bereit ist, ein Startbit zu erkennen.
Micha R. wrote: > Muss ich denn dann immer davon ausgehen, dass in so einem Fall immer nur > Mist empfangen wird? Ja. Man kann aber zur Synchronisation ein Byte senden, welches keinen inneren Pegelwechsel hat, z.B. 0xFF. Dann wird das nächste Startbit immer richtig erkannt. Ich benutze das z.B. in meinem Bootloader. Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.