Hallo zusammen!
Arexx-Henk meinte in " Asuros SerWrite(..) - Verständnisproblem":
....
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.
....
Leider hat Henk _nicht_überall_ Recht! (Mit den 3 letzten Sätzen schon!
) )
Da könnte man (_etwas_besser_!
) ) schreiben: "UCSRB |= 0x10; //enable receiver"
... und zum Ausschalten: "UCSRB &= ~0x10; //disable receiver"
Prog.-Teil aus "SerWrite()":
Code:
....
}
while (!(UCSRA & 0x40)) // abwarten, bis das _letzte_Zeichen_
; // uebertragen wurde.
// Wait for transmit complete flag (TXC)
// Bis hierher wurde ALLES uebertragen! *************************************
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
for (i = 0; i < 0xFE; i++) // warten auf irgendwas; keiner weiss
for (length = 0; length < 0xFE; length++); // wofuer
}
.....
Was soll da bitte noch übertragen werden, wenn's schon fertig ist??
Und
" if (UCSRA & 0x20) // wait for empty transmit buffer "
===>> "0x20" ist "bit 5"!
cu Helmut
Lesezeichen