RS232 nichtblockierendes Senden (Fleury)

Gast #1837518
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:
1
void uart_putc(unsigned char data)
2
{
3
    unsigned char tmphead;
4

5

6
    tmphead  = (UART_TxHead + 1) & UART_TX_BUFFER_MASK;
7

8

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

13
    UART_TxBuf[tmphead] = data;
14
    UART_TxHead = tmphead;
15

16

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

20
}

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.
#1837529
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.
#1837532
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

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.