Hallo Florian,

Da ich sowieso nicht schlafen konnte, habe ich hier ein Beispielprogramm geschrieben.
Es arbeiet mit einem sram Puffer, hollt also alle Zeichen, die empfangen werden in den Speicher, und erst nachdem man Return betätigt hat wird der Puffer ausgewertet.
Es hat auch eine kurze interrupt routine, und verwendet Flags bzw. nur eine Flagge, die in der loop routine permanent abgefragt wird.
Zugegeben, so schlau bin ich noch nicht, um mir das ganze so auszudenken,
Den Code habe ich mir hier unter Akkuloader abgeschaut und etwas abgeändert.
Das hat der Gerd richtig gut programmiert.
Als Beispiel empfängt es zeichen , wenn man hilfe eintipt wird ein Text ausgegeben, amsonsten eine Fehlermeldung.
Man kann sehr einfach weitere Befehle interpretieren und nach ein paar kleinen Änderungen auch Parameter übergeben...
Ich hoffe, daß ich es ausreichend kommentiert habe, wenn Fragen auftretten, frag mal ruhig, vielleicht kann ich sie auch beantworten.
Was man für sich ändern muß ist nur der Pfad zu der *.inc Datei, sowie Clock und Baudrate.

Gruß Sebastian
Code:
.include "../../m8def.inc"

;Definition für Clock und Baudrate
.equ CLOCK = 12000000 ; Processortaktfrequenz
.equ BAUD = 9600 ; Serielle Schnittstelle Baudrate
.equ UBRRVAL = CLOCK / (BAUD*16)-1
;Definition für Flagregister und Flaggen
.def Flagregister  = R16 ; Anzeige Flag Register
.def tmp = R17 ;universallregister
.equ zeileempfangen  = 7 ; Eine vollständige Zeile über UART empfangen

;Definition für Zeichen
.equ enter = $0D ; Wagenrücklauf-Zeichen für UART

;Definition für SRAM Puffer
.equ pufferzeiger = $0060 ; UART Rx Pufferzeiger
.equ pufferanfang = $0061 ; UART Rx Pufferanfang
.equ pufferende = $007E ; UART Rx Pufferende


;Interrupt-Vektoren

.org 0x000
	rjmp reset ;reset Vektor
.org URXCaddr
	rjmp empfangen

reset:
	;Stack
	ldi tmp,HIGH(RAMEND)
	out SPH,tmp
	ldi tmp,LOW(RAMEND)
	out SPL,tmp
	
	;UART
	;Baudrate einstellen
	ldi tmp,UBRRVAL
	out UBRRL,tmp
	;Frameformat 8Bit
	ldi tmp,(1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) 
	out UCSRC,tmp
	;RX aktivieren
	sbi UCSRB,RXEN
	sbi UCSRB,RXCIE
	;TX aktivieren
	sbi UCSRB,TXEN
	sei

loop: ;Hauptschleife
	tst Flagregister 	;Irgendeine Flagge gesetzt?
	breq loop		;wenn nein langweilen
	ldi tmp,LOW(loop) ; Schleifenanfang als Rücksprungadresse auf den Stapel
	push tmp
	ldi tmp,HIGH(loop)
	push tmp
	sbrs Flagregister,zeileempfangen	;teste, ob eine Zeile Komplet ist 
	ret		;wenn nein langweilen

befehlauswerten:
	ldi tmp,LOW(UartRxRet) ; Rueckkehradresse UartRxRet auf Stapel
	push tmp
	ldi tmp,HIGH(UartRxRet)
	push tmp
	ldi ZH,HIGH(2 * Cmds) ; Z zeigt auf Befehlsliste
	ldi ZL,LOW(2 * Cmds)
befehlauswerten1:
	lpm	;Hole Zeichen
	mov tmp,R0
	cpi tmp,0xFF ; 0xFF signalisiert das ende der Befehlsliste	 
	brne befehlauswerten3
befehlauswerten2: ;Ende der liste, unbekannter Befehl
	ldi ZH,HIGH(2 * kennenicht)	;Sende Fehlermeldung
	ldi ZL,LOW(2 * kennenicht)
	rjmp UARTSend
befehlauswerten3:	;hier fangen wir an zu vergleichen
	ldi XH,HIGH(pufferanfang)	;X auf empfangene Zeile
	ldi XL,LOW(pufferanfang)
befehlauswerten4:
	lds tmp,pufferzeiger;Pufferzeiger lesen
	cp XL,tmp	;Ende des Puffers erreicht?
	brcs befehlauswerten7	;nein weiter
befehlauswerten5:
	lpm	;lese nächstes Befehlszeichen	
	adiw ZL,1 ;Z auf nächstes zeichen
	mov tmp,R0
	cpi tmp,'#'	;Endzeichen erreicht?
	brne befehlauswerten5
befehlauswerten6:
	adiw ZL,3	;Springe über die Adressen	
	rjmp befehlauswerten1	;nächster Befehl
befehlauswerten7:
	lpm
	mov tmp,R0
	cpi tmp,'#' ;Ende des Befehls?
	breq befehlauswerten8
	ld tmp,X+	;lese nächstes Zeichen aus Puffer
	cp tmp,R0	;Vergleiche
	brne befehlauswerten5
	adiw ZL,1	;nächstes Zeichen
	rjmp befehlauswerten4
befehlauswerten8:
	lds tmp,pufferzeiger ;ende des Puffers erreicht?
	cpc XL,tmp
	brcc befehlauswerten2
	adiw ZL,1
	lpm
	push R0
	adiw ZL,1
	lpm
	push R0
	ret

UartSend:
	lpm;lese aus dem Flash
	adiw ZL,1
	tst R0
	brne UartSendR0
	ret
UartSendR0:
	mov tmp,R0
	rcall UARTSendChar
	rjmp UartSend
UartSendChar:
	sbis UCSRA,UDRE
	rjmp UartSendChar
	out UDR,tmp
	ret

UartRXret:
	ldi tmp,LOW(pufferanfang)
	sts pufferzeiger,tmp
	cbr Flagregister,(1<<zeileempfangen)
	ret
	
help:
	ldi ZH,HIGH(2*UartTxtHelp) ; Hilfetext
	ldi ZL,LOW(2*UartTxtHelp)
	rjmp UartSend	

empfangen:
	push tmp	;rette universallregister
	in tmp,SREG	;rette SREG
	push tmp
	in tmp,UDR	;Hole das empfangene Zeichen
	out UDR,tmp	;Echo zurück 
	push ZH		;sichere Z-Register
	push ZL	;dito
	ldi ZH,HIGH(pufferanfang) ;position fürs nächste Zeichen MSB
	lds ZL,pufferzeiger
	st Z+,tmp	;Speichere Zeichen im sram
	cpi ZL,LOW(pufferende+1)	;Pufferende erreicht ?
	brcc empfangen_		;Pufferüberlauf
	sts pufferzeiger,ZL	;speichere nächste Pufferposition
empfangen_:
	cpi tmp,enter		;Wagenrücklauf?
	brne empfangen__
	sbr Flagregister,(1<<zeileempfangen)
empfangen__:
	pop ZL	;Stelle Z-Register wieder her
	pop ZH	;dito
	pop tmp	;Stelle SREG wieder her
	out SREG,tmp	;dito
	pop tmp		;stelle tmp wieder her
	reti		;verlasse Routine und schalte Interrupts wieder ein
	

			;Hier fangen die Befehle an:
                        ;alle Befehle müssen mit # terminiert werden
Cmds:
.db "hilfe#"
.dw help
			;0xFFFF muß zum schluß stehen, um ende der liste zu erkennen
.dw 0xFFFF

;Ende der Befehldefinition

;Texte
UartTxtHelp:
.db "Das ist ein Hilfe Text ",0x0D,0x0A,0x00
kennenicht:
.db "Ich weiß nicht, was Du von mir willst",0x0D,0x0A,0x00