Du brauchst "drumrum" einen "Timeout-Zähler", der in einem
Timerinterrupt eine Variable herunterzählt und wenn die 0 ist brichst du
den Empfang ab. Und bei jedem empfangenen Zeichen setzt du den Zähler
auf einen Wert, der einer halben Sekunde entspricht.
Oder viel, viel besser: du stellst deinen Programmierstil auf eine
Automatenschreibweise um.
Die Hauptschleife wird dauernd möglichst schnell durchlaufen. Und pro
Durchlauf wird geschaut, ob was an der seriellen Schnitte angekommen
ist. Wenn ja: verarbeiten. Wenn nein: weiter. "Weiter" bedeutet z.B.
Tastenabfrage, Zähler verwalten, Abläufe koordinieren. Auf diese Art
wird der Controller nicht durch das "Warten" auf irgendwas blockiert,
weil ja nie "gewartet" wird...