USART Sender wartet auf Empfänger

Gast #617000
Lesenswert?
• ▲
▼
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 ?
#617019
Lesenswert?
• ▲
▼
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).
Gast #617025
Lesenswert?
• ▲
▼
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 ?
#617085
Lesenswert?
• ▲
▼
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'
Persönliche Seite #617274
Lesenswert?
• ▲
▼
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?
#617277
Lesenswert?
• ▲
▼
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
Gast #617291
Lesenswert?
• ▲
▼
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%
Gast #617365
Lesenswert?
• ▲
▼
>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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.