Das S steht für synchron, das A aber für asynchron. Der USART versteht zwei unterschiedliche Modi, w4elche aber nur die Bitübertragung betreffen. Bei S braucht es eine zusätzliche Taktleitung, bei A dann Start- und Stopp-Bits.
Zuerst einmal ist so ein USART ein Schieberegister.
Beim Sender schreibst du dein Datum in das Schieberegister rein und die Bits werden dann einzeln über die Leitung geschoben. Beim Empfänger geht es umgekehrt.
Wenn du jetzt neue Daten ins Schieberegister schreibst, während die alten noch nicht draussen sind, gibt es Datensalat.
Praktisch spendet man dem Schieberegister noch ein Buffer-Register in welches du eigentlich deine Daten schreibst. Wenn das Schieberegister leer ist, übernimmt es die Daten aus dem Buffer. Damit du weisst, wann das Buffer-Register geleert ist, gibt es das TE-Bit. Sobald das Buffer-Register geleert ist, wird dieses Bit gesetzt, schreibst du dann was in den Buffer, wird das TE-Bit wieder zurückgesetzt.
Der Empfänger ist eigentlich gleich aufgebaut. Wenn das Schieberegister alle Bist eingesammelt hat, werden diese in den Buffer kopiert und das RE-Bit gesetzt. Jetzt kann das Schieberegister schon den nächsten Datenstrom empfangen. Beim Lesen des Buffers wird dann das RE-Bit zurückgesetzt oder man muss es extra zurücksetzen.
Will das Schieberegister Daten in den Buffer schreiben und das RE-Bit ist noch gesetzt, gibt einen Buffer-Overrun-Fehler.
Je nach Bitrate dauert das Schieben der Daten aber. Bei 9600 Bit/s und asynchron, werden jeweils 10 Bit übertragen, also maximal 960 Zeichen/s. Das sind dann 1.04ms/Zeichen.
In 1ms kann aber eine CPU eine Menge Code abarbeiten.
Du musst also in deinem Code sicherstellen, dass beide Bytes auch schon übertragen wurden!
Hier steckt der Wurm drin!Code:while (1) { uint8_t HByte = usart_empfang; uint8_t LByte = usart_empfang;
Bei der zweiten Abfrage von usart_empfang weisst du gar nicht ob da schon was neues drin steht.
MfG Peter(TOO)
Lesezeichen