Hallo, 1.)kann mir bitte jemand erklären was Parity, 9Bit, und die stop bits bedeuten, und wann sie eingesetzt werden? 2.)In meinen Terminalprogrammen kann ich nirgends 9bit einstellen. Ich würde gerne 16Byts hintereinander vom Atmega8 empfangen, wobei der erste Byte aus synchronisationsgründen den 9.bit als 1 liefern sollte. Oder macht man das irgendwie anders? Danke Zoltan
Da muss man irgendwie den Parity bit, als 9.bit nutzen. Wie ich das im mikrocontroller machen könnte kann ich mir vorstellen, aber wie konfiguriere ich den PC?
Hallo,
>1.)kann mir bitte jemand erklären was Parity, 9Bit, und >die stop bits bedeuten,
und wann sie eingesetzt werden?
Das Parity-Bit ist eine "Quersumme" über die 8 Datenbits.
Also, ungerade Anzahl von "1" = Parity gesetzt, gerade Anzahl von "1",
Parity nicht gesetzt.
Da man sich damals wohl nicht so ganz sicher war flexibel genug zu sein
gibt es eben die beiden Parity "even/odd".
Bei "odd" wie oben beschrieben, Einstellung "even" dreht alles um (Es
kann auch sein das es genau anders herum ist, merken konnte ich es mir
nie).
Das 9.Bit kann bei einigen Mikrocontroller oder UART Bausteinen seperat
programmiert werden. Beim 8515 ist zum Beispiel kein Parity-Bit
vorhanden, wohl aber ein programmierbares 9.Bit. Das kann dann als
Parity-Bit benutzt werden. Es gab auch mal ein Protokoll mit 9 Bit
Daten, das 9.Bit hat ein Steuertelegramm gekennzeichnet.
Die Stopp-Bits kennzeichnen das Ende vom Sendebyte.
Der logische Pegel liegt fest. Es gibt Einstellungen mit 1, 1.5 oder 2
Stoppbits.
Zum Syncronisieren würde ich ein zeichen nehmen das im sonstigen
Telegramm nicht vorkommt.
Bei reiner ASCII Übertragung bietet sich <STX> zum Telegrammanfang und
<ETX> als Ende an. Diese Steuerzeichen liegen ausserhalb der
ASCII-Zeichen und lassen sich sicher erkennen.
Bei Binärdaten wirds schwieriger.
Dabei sind ja alle Bitkombinationen möglich und es muss das ganze
Telegramm mit Header-Informationen übertragen werden so daß sicher
Syncronisiert werden kann.
Bernd
Eine Prozessoren wie z.B. die neueren Mega's bieten in der UART-Sektion die Möglichkeit neben Parity und 1 oder 2 Stop-Bits bis zu 9 Datenbits zu übertragen. Der UART in einem handelsüblichen PC (16C550 bzw. Kompatible hat diese Option nicht). Als Lösung des Problems bietet sich entweder die Synchronisation über einen bewussten Fehler (z.B. Parity oder Framing Error an) an. Hier ist allerdings die Programmierung eines eigenen Device-Treibers auf PC-Seite erforderlich. Eine andere Möglichkeit besteht darin, wenn man schon alle 8 Bit benötigt diese auf 7 Bit Blöcke zu verteilen und das 8. Bit zur Synchronisation zu verwenden.
Danke für die Antworten! @Berndt warum gibt es 1, 1,5 oder 2 Stoppbits? Ich werde am besten z.B. drei Bytes als Synkronisations-Bytes senden, und die Sache mit dem 9. Bit vergessen. Den AVR zu programmieren ist ja "kein Problem" aber was ich mit dem PC machen muss, das geht etwas zu weit. Und nur 7 Bit sind leider nicht zu gebrauchen. Kennt ihr vieleicht proffesionellere Terminalprogramme, in dennen mann auch 2Byte als dezimalzahl ausgeben kann(0..65535). Mit den Werten bis 255 kann ich nichts anfangen, da ich 16 Bit grosse Zahlen übertragen und darstellen möchte.
@Zoltan Warum wandelst du die 16 Bit Zahlen nicht gleich auf ATMEL Seite in entsprechende ASCII Darstellung um. Ist doch wesentlich einfacher und erspart dir die Erstellung eines entsprechden Programms für deinen PC.
Ich würde die zu übermittelnden Zahlenwerte in Hexstrings umwandeln und so (als String) übertragen. Dann kannst du jedes Telegramm mit einem Startzeichen (STX = 0x02) versehen. Also um Beispielsweise die Zahl 1000(Dezimal) zu übertragen müsstest du die 1000 als Hex 03e8 übertragen, mit führenden Startzeichen ergibt sich dann <STX>03e8 Nach Wunsch kannst du am Schluss auch noch ein ETX (0x03) anhängen. Gruss Christian
@bernd die Sache mit den Stopbíts (>1) hat eher historische Gründe, sollte der empfangenden Station mehr Zeit geben, entsprechende Aktionen auszuführen. Die Netto-Datenrate wird dabei niedriger. Ich kenne keine Anwendung, bei der heute noch mehr als 1 Stopbit verwendet wird.
Erstmal danke für die Tipps! @mikki Ich teile den 16Bit(z.B. 1000) Wert im AVR und sende sie dann als zwei 8Bit Werte an den PC. Da muss ich sie aber auch wieder als 1000 angezeigt bekommen un nicht als 0x03 und 0xE8 oder 3 und 232. L=mein_wert; // 16bit into 2x 8bit mein_wert>>=8; H=mein_wert; uart_send(L); //Wert1 ->PC_1 uart_send(H); //Wert1 ->PC_2 Ich habe meinen Bruder überreden können einen, noch nicht ferigen, Programm zu schreiben, um diese Werte von oben wieder im PC zusammen fügen zu können. So kann ich jetzt 8, 16, 24, 32Bit Werte als dez Darstellen. Siehe Anhang. Dann hat der AVR weniger zu tun und muss keine Startzeichen übertragen. Wäre auch unfair gegenüber den kleinen MC, wenn hier ein 1000 Euro PC nur so rumsteht, und die ganze Arbeit der AVR machen muss..
>@Bernd >warum gibt es 1, 1,5 oder 2 Stoppbits? die 1.5 Stppbits kommen aus der Fernschreibtechnik. Damals wurde mechnisch das Ende erkannt und 1.5 Stoppbits waren wohl einfacher festzustellen. Bernd
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.