Hallo,

Sieht nach einem sehr klaren Fall von einer Race-Condition aus.

Du schreibst mehrere Zeichen über die UART an den Mikrocontroller. Als erstes Zeichen schreibst du ein 'e'. Die erste if-Abfrage evaluiert zu true, folglich wird der String "Yes, we wrote e" über die UART an den PC geschrieben. Da du die UART-Übertragung blockierend implementiert hast, dauert der Aufruf der Funktion send_string("Yes,we wrote e") (1/(Baudrate/10))*AnzahlZeichenVon"Yes,we wrote e". Das ist auf jeden Fall länger, als es dauert bis das nächste Zeichen empfangen wird. Der Effekt: Während deine Hauptprogrammabarbeitung noch in der Funktion send_string "festhängt", werden mehrere Zeichen empfangen, die dann jeweils die Variable receive_char überschreiben. Für dich macht das den Eindruck, als ob die if-Abfrage nicht evaluiert werden würde, da nur das Zeichen evaluiert wird.

Die Verwendung von cli() und sei() verbessert das Verhalten, da damit Interrupts während der Übertragung gesperrt werden, damit kannst du aber ebenso empfangene Zeichen verlieren.

Die beste Methode wäre die Implementierung eines Empfangs- und Sende-Ringbuffers, hierfür verweise ich auf die weiterführende Literatur z.B. hier und hier