1) die ISR-Routinen würde ich unverändert lassen.
2) Sooo lange dauert eine Auswertung in main() auch nicht, wenn man's richtig anstellt
3) Falls die Zeichen zu flott ankommen, kann man sie über ne FIFO puffern, ein Beispiel dazu ist im wiki.

Ob ein kompletter Befehl angekommen ist, kannst du erkennen, indem jeder Befehl zB mit einem Zeichen wie # endet oder jeder Befehl ne bestimmte länge hat.

Ich würd allerdings ne 'inkrementelle' Erkennung vorschlagen, d.h. es gibt keine eigene Schleife für die Erkennung uneterhalb von main, sondern wenn ein neues Zeichen ankommt geht die Erkennung um dieses 1 Zeichen weiter.

Dazu muss man sich den Status der Erkennung merken (wieviel Zeichen sind schon da, etc.). Dein main()-Schleife muss dazu nicht-blockierend aufgebaut sein, also ohne wait() und so üblen Kram.