Forum: Compiler & IDEs RS232 nichtblockierendes Senden (Fleury)


von Rolf (Gast)


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.

von Karl H. (kbuchegg)


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.

von Uwe .. (uwegw)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.