Hallo,

Ich glaube die Losung vom Warteschleife Ratsel ist eigentlich ganz einfach.
Mir begegnete es weil es Tx Probleme gab.


Vorbild:

- die Asuro sendet einige Daten mittels den

SerWrite() Funktion

- die Asuro schaltet direkt um nach empfangen mittels den

SerRead() Funktion

ohne diesen Warteschleiffe in die SerWrite() Funktion werden
die letzten drei Karakter vom transmitter nicht mehr
ausgestrahlt.

Warum nicht?

Guck mal in die SerRead() Funktion.

Dort steht u.a.

UCSRB = 0x10; //enable receiver

Mit diesen Kode wird die receiver eingeschaltet ABER
damit wird auch die transmitter direkt AUSgeschaltet.

Die Warteschleife ist lange genug um 3 Karakter zu versenden,
damit die zwei Karakter im UDR Puffer und das eine Karakter
im Tx-Schieberegister nach aussen geschieben sind wenn dass
Program die SerWrite() Funktion verlasst.


Eine schonere losung ware es die Warteschleife zu ersetzen
mit Folgendes:

//warte bis UDR und Schieberegister leer sind

while ( ! ( UCSRA | (1<<TXC) ) );

//reset handmassig den TXC bit durch schreiben einen '1' !
UCSRA |= (1<<TXC);


Dies alles hab ich ausprobiert und mit einem Oszi recherchiert.

Funktioniert Tadelos!


Gruss

Henk