Für solche Anwendungen ist es hilfreich, die Steuerbefehle mit einem speziellen Zeichen beginnen und enden zu lassen. Dann wartet man beim Empfänger, bis das Startzeichen kommt. Nun werden alle folgenden Zeichen in einen String gepackt, bis das Endzeichen kommt. Nun weiß man, dass ein kompletter Befehl empfangen wurde, und kann auswerten, welcher es ist.

Ich hab das neulich für ein Projekt so umgesetzt. Bei mir beginnen alle Befehle mit einem Unterstrich und enden mit einem Semikolon.
Ich benutze die UART-Lib von P. Fleury. Meine Funktion muss reglemäßig aufgerufen werden, und holt dann alle inzwischen empfangenen Zeichen aus dem FiFo (Teil der UART-Lib). Wenn ein kompletter Befehl da ist, wird ein Pointer auf den Befehlstext geliefert, ansonsten ein Nullzeiger. Man muss nun also zuerst auf Null testen, und dann ggf. mit allen vergebenen Befehlstexten vergleichen.
Code:
/* Liest Zeichen vom UART ein und sucht nach Befehlen.
   Jeder Befehl beginnt mit _ und endet mit ;
   Diese Zeichen werden nicht mit zurueckgegeben!
   Rueckgabewert: Zeiger auf Befehlsstring, wenn neuer Befehl erkannt,
   sonst Nullzeiger  */
char * kommando_lesen(void)
{
	uint16_t rxc; //empfangenes Zeichen
	#define MAXCMDLENGHT 10 //maximale Befehlslänge
	static char cmdstr[MAXCMDLENGHT+1]; //Zwischenspeichern eines Befehls
	static uint8_t rxcnt=0;
	uint8_t cmdstr_valid=0;

	rxc = uart_getc(); //UART abfragen
	//solange Zeichen im Empfangspuffer sind, diese verarbeiten
	while(!( rxc & UART_NO_DATA )) 
	{
		switch((char)rxc)
		{
		case '_':
			rxcnt=0;             //Neuer Befehl hat begonnen
			cmdstr_valid=0;
			break;

		case ';':
			if(rxcnt>0)          //Mindestens ein Zeichen wurde empfangen
			{
				cmdstr[rxcnt]=0;   //String abschliessen
				cmdstr_valid=1;
			}
			break;

		default:  
      //ein beliebiges Zeichen wurde empfangen -> an String anhaengen
			cmdstr[rxcnt]=(char)rxc;
			rxcnt++;
			if(rxcnt>MAXCMDLENGHT) //Fehler: zu viele Zeichen am Stück 
			{
				rxcnt=0; //Bisherige Daten verwerfen
			}
			break;
		}
		//UART weiter abfragen, um zu erkennen, ob noch Zeichen kommen
		//Wenn jetzt UART_NO_DATA gelesen wurde,
		// wird die while-Schleife verlassen
		rxc = uart_getc();
	} //while(...)

	if(cmdstr_valid)
	{
		return cmdstr; //Kompletter Befehl empfangen -> zurückgeben
	}
	else
	{
		return 0; //kein kompletter Befehl -> Nullzeiger zurückgeben
	}
}//Ende der Funktion kommando_lesen()