www.mikrocontroller.net

Forum: Compiler & IDEs RS232 nichtblockierendes Senden (Fleury)


Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verwende die Library von Peter Fleury und bin eigentlich ganz 
zufrieden. Mich stört nur, dass der Controller Blockiert wird, wenn der 
Buffer voll ist:
void uart_putc(unsigned char data)
{
    unsigned char tmphead;


    tmphead  = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;


    while ( tmphead == UART_TxTail ){
        ;/* wait for free space in buffer */
    }

    UART_TxBuf[tmphead] = data;
    UART_TxHead = tmphead;


    /* enable UDRE interrupt */
    UCSRB    |= (1<<UDRIE);

}

gibt es da eine bessere Implementierung? Z.B., dass ich die Funktion in 
die Hauptschleife rein nehme, und bei jedem Schleifendurchlauf geprüft 
wird, ob der Buffer jetzt leer ist. So das während des Wartens noch 
andere Dinge erledigt werden können.

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

Bewertung
0 lesenswert
nicht lesenswert
Rolf schrieb:
> Hallo,
>
> ich verwende die Library von Peter Fleury und bin eigentlich ganz
> zufrieden. Mich stört nur, dass der Controller Blockiert wird, wenn der
> Buffer voll ist:

Na ja irgendwas muss er ja machen


> gibt es da eine bessere Implementierung? Z.B., dass ich die Funktion in
> die Hauptschleife rein nehme, und bei jedem Schleifendurchlauf geprüft
> wird, ob der Buffer jetzt leer ist. So das während des Wartens noch
> andere Dinge erledigt werden können.

Du bist frei in dem was programmiert wird.
Mach dir in dei Fleury Lib eine Funktion rein, die dir die Abfrage 
gestattet, wieviel Buffer zur Zeit zur Verfügung steht.

Aber was tust du zb. wenn du einen String mit 60 Zeichen Länge über 
einen Transmit-Buffer mit lediglich 40 Zeichen Platz versenden willst? 
Die Original-Implementierung der String-Sende Funktion schiebt die 
ersten 40 Zeichen direkt in den Buffer und geht dann in Warteposition. 
Sobald durch die Hardware ein Zeichen rausgeschickt wurde, rutscht 
wieder ein Zeichen nach, so dass der Buffer ständig gefüllt bleibt. 
Irgendwann ist der Punkt erreicht, an dem 20 Zeichen bereits 
rausgeschickt wurden, der Buffer mit seinem 40 Zeichen die restlichen 
Zeichen zwischenspeichert und daher die String-Funktion returnen kann, 
obwohl der lange String noch gar nicht komplett draussen ist.

Klar kannst du an den Aufrufer delegieren, dass der nur dann in die 
Sendefunktionen geht, wenn auch sicher ist, dass alles rausgehen kann. 
Aber es gibt eben auch immer Sonderfälle, die dann komplizierter werden.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Statt hier zu warten, könntest du natürlich die Funktion auch einen 
Fehlercode zurückgeben lassen, der dann im Hauptprogramm abgefragt wird. 
Wenn dann gemeldet wurde, dass das letzte Zeichen nicht gesendet wurde, 
kannst du dann vor dem nächsten Versúch noch was anderes machen.

Solange aber noch genügend RAM frei ist, würde ich erst mal das FIFO 
etwas vergrößern.

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.