UDRE ist der Name eines Bits (genauer gesagt: eines Flags) im UCSRA.
UDRE wird von der Hardware automatisch gesetzt, wenn der Sendepuffer
leer ist, also wenn ein neues Zeichen in den Puffer (UDR) geschrieben
werden kann. In der Device-Headerdatei des verwendeten Controllers steht
irgendwo eine Definition dieses Namens, der ihm eine Nummer zuweist, und
zwar die Nummer, die das Bit im Register hat. Das sieht so aus:
Das #define sorgt dafür, dass an allen Stellen im Code, an denen "UDRE"
auftaucht, dieser Name durch die Zahl "5" ersetzt wird.
In der Schleifenbedingung steht jetzt der ominöse Ausdruck
Da der Präprozessor das "UDRE" durch eine "5" ersetzt, steht da
Das wiederum bedeutet, dass eine binäre "1" (0b00000001) um 5 Stellen
nach links geschoben wird. 1 << 5 entspricht also der Binärzahl
0b00100000. Mit dieser Binärzahl, die in diesem Zusammenhang auch als
"Maske" bezeichnet wird, wird jetzt das UCSRA bitweise UND-verknüpft.
Das führt dazu, dass alle Bits bis auf das mit der Nummer 5 (nämlich das
UDRE) "ausgeblendet" werden. Ist das Bit gesetzt, dann liefert der
Ausdruck "(UCSRA & (1<<UDRE))" ein 0b00100000 zurück, andernfalls eine 0
(0b00000000). Dieser Ausdruck wird jetzt noch logisch negiert. Das
wiederum bedeutet, dass aus allem, was ungleich 0 ist eine 0 wird, und
aus 0 eine 1. Ist das Bit "UDRE" also gesetzt, dann steht nach
Auswertung des Ausdrucks "!(UCSRA & (1<<UDRE))" effektiv eine 0 in der
Klammer, was dazu führt, dass die Schleife verlassen wird. Ist das Bit
UDRE nicht gesetzt, steht da eine 1 ("wahr") und die Schleife wird
weiterhin durchlaufen.