mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART Sender wartet auf Empfänger


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
XON/XOFF oder Hardware Flußkontrolle

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yo du meinst sicher Softwarehandshake (XON/XOFF). Aber gibt es ein Code 
Beispiel an dem man sich orientieren kann ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht das Zeichen XON nicht für eine Hexzahl, so wie bei JPEG z.B. EOI 
mit 0xFF und 0xD9 ausgedrückt wird ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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'

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, also ein

ser_putc(0x13); == ein XOFF
ser_putc(0x11); == ein XON

oder ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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%

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe an meinem MAX232N 10 uF Kondensatoren, könnte das ein Problem sein, 
dass ich 1 uF Kondensatoren benötige ?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Es sei denn mit U2X=1

Das wars ! Danke !!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.