Hallo,

Hier die Version des Empfangsprogramm mit Interrupts...
Kommentare fehlen leider, aber ich hoffe es ist einigermassen verständlich.

Code:
//Empfangen
#include <P18F252.h>					//Bibliothek einbinden
int ring;								//Variable definieren
void open_serial(void);					//Definition der Unterprogramme
void initINT (void);					//Definition der Unterprogramme
void InterruptHandler (void);			//Definition der Unterprogramme
void InterruptVektor (void);			//Definition der Unterprogramme
#pragma code InterruptVektor = 0x08		//Vektor für hohe Priorität
#pragma code
#pragma interrupt InterruptHandler

void main (void) 
{
ADCON1 = 7;								//PORTA digital
LATA = 0x00;							
TRISA = 0x00;							//PORTA als Ausgang
TRISB = 0x00;							//PORTB als Ausgang
ring = 0;
RCREG = 90;								//Anfangswert RCREG
open_serial();							//USART-Modul konfigurieren
initINT();								//Interrupts konfigurieren
	while(1)
	{
	PORTB = 0xFF;						//PORTB auf High setzen
	}
}

void open_serial()
{
	SPBRG = 103;						//Baud-Rate
	TXSTAbits.BRGH = 0; 				//Baud-Rate
	TXSTAbits.SYNC = 0;					//Asynchrone Übertragung
	TRISCbits.TRISC6 = 0; 				//RB6 als Ausgang
	TRISCbits.TRISC7 = 1; 				//RB7 als Ausgang 
	RCSTAbits.SPEN = 1; 				//Seriellen Port aktivieren 
	TXSTAbits.TX9 = 0; 					//8-Bit Sendung
	RCSTAbits.RX9 = 0; 					//8-Bit Empfang
	RCSTAbits.CREN = 1; 				//Empfänger aktivieren
	TXSTAbits.TXEN = 0; 				//Sender deaktivieren
	PIR1bits.PSPIF = 0;					//Laut Datenblatt zu löschen
	PIE1bits.PSPIE = 0;					//Laut Datenblatt zu löschen
	IPR1bits.PSPIP = 0;					//Laut Datenblatt zu löschen
	RCSTAbits.FERR = 0;					//Laut Datenblatt zu löschen
	RCSTAbits.OERR = 0;					//Laut Datenblatt zu löschen
}

void initINT()
{
PIE1bits.TXIE = 0; 						//Sende-Interrupt deaktivieren
PIE1bits.RCIE = 1; 						//Empfangs-Interrupt aktivieren
INTCONbits.GIE = 1; 					//Globale Interrupt-Freigabe
INTCONbits.PEIE = 1;					//Periphere Interupts freigeben
RCONbits.IPEN = 1;						//High-Priority Interrupts freigeben
INTCONbits.GIEH = 1;					//High-Priority Interrupts freigeben
IPR1bits.RCIP = 1;						//Empfangs-Interrupt erhält hohe Priorität
}

void InterruptHandler()					//Interrupt-Service-Routine
{
INTCONbits.GIE = 0; 					//Interrupts deaktivieren
PORTB = 0x00;							//PORTB löschen (zeigt dass Interrupt ausgelöst wird)
PORTA = RCREG;							//Empfnags-Buffer auslesen
PIR1bits.RCIF = 0;						//Flag des Empfangs-Interrupt löschen
INTCONbits.GIE = 1; 					//Interrupts wieder aktivieren
}

void InterruptVektor (void)				//Interrupt-Vektor festlegen
{
_asm
	goto InterruptHandler
 _endasm
}
edit: Zum besseren Verständnis habe ich noch Kommentare hinzugefügt.