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 ?
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 ?
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'
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%
>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