hi, es ist doch möglich dem Sender bei einer USART Datenübertragung über den Empfänger mitzuteilen, dass er seine Datenübertragung kurz unterbechen soll bis der Empfänger eine kurze Routine durchgearbeitet hat und dann mit dem Sender fortfahren soll. Wie geht das genau, welche Bytes ?
Yo du meinst sicher Softwarehandshake (XON/XOFF). Aber gibt es ein Code Beispiel an dem man sich orientieren kann ?
Matthias wrote: > Yo du meinst sicher Softwarehandshake (XON/XOFF). Aber gibt es ein Code > Beispiel an dem man sich orientieren kann ? Da gibts eigentlich nicht viel, woran du dich 'orientieren' musst. Die Empfangsroutine beim Sender, überprüft jedes Zeichen das hereinkommt, ob es ein XOFF oder ein XON war. Ist es ein XOFF, dann wird eine globale Variable auf zb 1 gesetzt und wenn ein XON empfangen wird wird die globale wieder auf 0 zurückgesetzt. Die Senderoutine im Sender prüft bei vor jedem Zeichen, das ausgegeben wird, ob die globale Variable auf 1 ist und wenn ja, dann wartet sie solange bis sie wieder auf 0 zurückfällt (oder aber sie bricht die Ausgabe ab und verschickt das Zeichen nicht sondern vertagt den Sendevorgang auf den nächsten Durchgang). Das ist im Prinzip schon alles was Senderseitig zu tun ist. Empfängerseitig gehts genau anders rum: Der Empfänger empfängt laufend Zeichen und speichert sie ev. in einem Buffer zwischen. Droht dieser Buffer überzulaufen oder hat der Empfänger keine Zeit, dann schickt er ein Zeichen XOFF. Ist er wieder aufnahme- bereit schickt er das Zeichen XON. Stell dir einfach eine Telefonleitung vor auf der 2 Menschen miteinander reden. Der eine muss plötzlich mitschreiben. Was macht er. Er sagt dem anderen 'Warte mal' (das ist das XOFF) und wenn es weiter gehen kann sagt er: "Fertig, weiter" (das ist das XON).
Super, danke für die detailierte Erklärung. Da mein Sender ein PC ist und mein Empfänger meine Schaltung, habe ich im Fallle eines Buffer-Überlaufs also nur ein puts("XOFF"); und nach der Zwischenspeicherung ein puts("XON"); zu tun ?
Steht das Zeichen XON nicht für eine Hexzahl, so wie bei JPEG z.B. EOI mit 0xFF und 0xD9 ausgedrückt wird ?
Matthias wrote: > Super, danke für die detailierte Erklärung. > Da mein Sender ein PC ist und mein Empfänger meine Schaltung, habe ich > im Fallle eines Buffer-Überlaufs also nur ein > > puts("XOFF"); > > und nach der Zwischenspeicherung > ein > > puts("XON"); > > zu tun ? Nein. Schau in die ASCII Code Tabellen. Da gibt es 2 Sonderzeichen: XON und XOFF XON, XOFF sind 2 Zeichen, so wie 'a', 'b', 'c', '\n'
ok, also ein ser_putc(0x13); == ein XOFF ser_putc(0x11); == ein XON oder ?
Matthias wrote: > ok, also ein > > ser_putc(0x13); == ein XOFF > ser_putc(0x11); == ein XON > > oder ? Wenn ser_putc() die Funktion ist, die ohne wenn und aber ein einzelnes Zeichen auf den Weg bringt, dann ja.
Karl heinz Buchegger wrote: > Matthias wrote: >> ok, also ein >> >> ser_putc(0x13); == ein XOFF >> ser_putc(0x11); == ein XON >> >> oder ? > > Wenn ser_putc() die Funktion ist, die ohne wenn und aber > ein einzelnes Zeichen auf den Weg bringt, dann ja. Wie stellt man beim XON/XOFF fest, ob das Zeichen ein XON/XOFF war und nicht etwas anderes? Oder verwendet man das nur bei Strings/Text?
Simon Küppers wrote: > Karl heinz Buchegger wrote: >> Matthias wrote: >>> ok, also ein >>> >>> ser_putc(0x13); == ein XOFF >>> ser_putc(0x11); == ein XON >>> >>> oder ? >> >> Wenn ser_putc() die Funktion ist, die ohne wenn und aber >> ein einzelnes Zeichen auf den Weg bringt, dann ja. > > Wie stellt man beim XON/XOFF fest, ob das Zeichen ein XON/XOFF war und > nicht etwas anderes? Oder verwendet man das nur bei Strings/Text? 3 Möglichkeiten * nur auf Text beschränken * bei binärer Übertragung darf dann logischerweise XON/XOFF in den Daten nicht vorkommen oder aber man schickt ein Byte vor dem XON/XOFF welches dem Empfänger mitteilt, dass es sich hierbei nicht um die Handshake Bytes XON/XOFF handelt sondern um normale Daten. Bzw die Bytes 0x11 bzw 0x13 werden anders übertragen um sie vor dem Handshake zu verstecken. * bei binärer Übertragung: kein XON/XOFF verwenden sondern Hardware Handshake
Ich versteh eines nicht. ich betreibe einen ATMEGA32 mit 16 MHZ und an meiner USART Schnittstelle habe ich einen MAX232 rangebastelt. Ab einer Baudrate von 115,2 bringt er nur noch Müll auf den Bildschirm, alle Baudraten davor laufen einwandfrei. Berechnet wird das ganze durch F_CPU/(Baudrate*16L)-1 und dann die 8 High Bits in UBRRH und 8 Low Bits ins UBRRL Ich würde genau diese Baudrate benötigen. Was mache ich falsch. Liegt es am MAX232. Die Fehlerwahrscheinlichkeit liegt laut Atmel bei 3,5%
Habe an meinem MAX232N 10 uF Kondensatoren, könnte das ein Problem sein, dass ich 1 uF Kondensatoren benötige ?
>Die Fehlerwahrscheinlichkeit liegt laut Atmel bei 3,5%
Und das ist zu viel ! Es sei denn mit U2X=1 . Dann sind es
nur noch 2,1% . Falls das auch nicht geht, nimm einen 14.7456MHz Quarz
oder geh halt mit der Baudrate runter.
@ Matthias (Gast) >Habe an meinem MAX232N 10 uF Kondensatoren, könnte das ein Problem sein, >dass ich 1 uF Kondensatoren benötige ? Nein. Mit grösseren Kondensatoren geht es immer, nur nicht mit kleineren. MfG Falk
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.