Hi, ich habe da ein seltsames Problem, welches auftritt, wenn ich nach dem Empfang eines Zeichens das UDR in mehreren if-Abfragen hintereinander mehrmals auslese. if(bit_is_set(UCSRA, RXC)) { if(UDR == 'o') { uart_puts_pgm(PSTR("O\n")); } if(UDR == 'l') { uart_puts_pgm(PSTR("L\n")); } } Wenn ich ein o sende erhalte ich sofort O als Rückmeldung, wie erwartet. Wenn ich allerdings ein l sende passiert was ganz komisches. Erst beim nächsten gesendeten Zeichen bekomme ich die Rückmeldung L, ganz egal was für ein Zeichen ich als letztes gesendet habe. Mal ein Beispiel was ich mache: Sende o - Rückmeldung O Sende l - nix Sende x (beliebiges Zeichen) - Rückmeldung L Sende x - nix Sende o - Rückmeldung O (hier klappts immer sofort) Sende l - nix Sende o - Rückmeldung O, sofort danach allerdings nochmal Rückmeldung L... wtf? Wird da irgendwie was gepuffert? Wenn ich UDR zuerst in eine tmp-Variable einlese und dann mit dieser arbeite, dann funktionierts. Warum? lg PoWl
UDR ist ein FIFO. List du einen Wert, ist er aus dem Puffer raus und du bekommst den nächsten Wert.
OK, ich habe im Beispiel zwei if-Abfragen. In der ersten wird nach "o" gefragt, in der zweiten nach "l". Wenn das ein FIFO ist und jedes Auslesen des UDR den FIFO um eins weiterrutschen lässt, wieso erhalte ich dann auf das l überhaupt noch eine Rückmeldung? sobald ich ein einzelnes Zeichen sende wird es ja durch die erste if-Abfrage (also durch das erste Auslesen des UDR) sofort wieder aus dem FIFO rausgezogen.
Lesen kannst du es so oft du willst. Wieso du bei deinem Programm manchmal doch (halbwegs) sinnvolle Sachen zurückbekommst, hängt an deinem Programm (das wir nicht sehen). Das UDR ist auch sehr gut im Datenblatt beschrieben (nur so als Standard-Antwort...).
Zitat aus dem Datenblatt:
1 | The two Buffer Registers operate as a circular FIFO buffer. Therefore the UDR must only be read once for each incoming data! |
Wenn du also mehrmals liest, ist das Verhalten undefiniert. Lese UDR also erst in eine temp Variable und prüfe die dann auf die gesuchten Zeichen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.