Im Prinzip ist es so wie Du schreibst
Ich schick Dir mal nen "C" Programmcode wie ich es gemacht hab

Zuerst der Sender:
Code:
// Sendestring vorbereiten
void builtstring (void)
{
unsigned char uc_stringbuffer[10];
volatile unsigned char uc_stringlengh;

uc_sendbuffer[0]=0xAA;
uc_sendbuffer[1]=0xAA;
uc_sendbuffer[2]=0xAA;
uc_sendbuffer[3]=0x2D;
uc_sendbuffer[4]=0xD4;
uc_sendbuffer[5]='$';
uc_sendbuffer[6]='3';
uc_sendbuffer[7]=';';
uc_sendbuffer[8]='1';
uc_sendbuffer[9]=';';
uc_sendbuffer[10]=0x00;

itoa (ui_time,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_voltage1,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_voltage2,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_voltage3,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";0;0;0;0;");

ltoa (li_temp1,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_temp2,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

ltoa (li_drehzahl,uc_stringbuffer);
strcat (uc_sendbuffer,uc_stringbuffer);
strcatf (uc_sendbuffer,";");

checksum(); /* Checksumme ermitteln und anfügen */

// Stringendebytes anfügen
uc_stringlengh=strlen(uc_sendbuffer);
uc_sendbuffer[uc_stringlengh]=13;    /* Carriage Return 13*/
uc_sendbuffer[uc_stringlengh+1]=10;    /* Line Feed 10 */
uc_sendbuffer[uc_stringlengh+2]=0;     /* Stringende anfügen */
}
Nun die Teile vom Empfängercode:
Code:
//FIFO Puffer initialisieren bei Fehlern und Datensatzende
void reset_fifo (void)    
{
    /* FIFO Command: Enable FIFO, IT level=8, Sync. Patt + VDI, stop FIFO  */
    #asm ("cbi portb,nsel");
    sendbyte(0b11001110);
    sendbyte(0b10001001);
    #asm ("sbi portb,nsel");
    #asm ("nop");
    
    /* FIFO Command: Enable FIFO, IT level=8, Sync. Patt + VDI, start FIFO  */
    #asm ("cbi portb,nsel");
    sendbyte(0b11001110);
    sendbyte(0b10001011);
    #asm ("sbi portb,nsel");
    #asm ("nop");
    uc_receivebyte=0;
}
Code:
// Empfange Daten vom RFM 01
interrupt [EXT_INT0] void ext_int0_isr(void)
{
    unsigned char uc_i=0;
    unsigned char uc_buffer=0;
    unsigned char uc_check=0;
    
    
    uc_timeout=0; /* Timeout Zähler zurücksetzen */
    
    /* Die ersten 16 Bit des Statuswortes übergehen */
    #asm ("cbi portb,nsel");
    sendbyte(0b00000000);
    sendbyte(0b00000000); 
    
    for(uc_i=0;uc_i<8;uc_i++)/* 8 Bits auslesen */
    {
        
        
        if ((PINB&(1<<3))!=0) /* SDO abfragen = PortB,3 */
        {
            uc_buffer=(uc_buffer<<1)| 0x01;
        }
        else
        {
            uc_buffer=(uc_buffer<<1);     
        }
        clockpulse();
    }
    #asm ("sbi portb,nsel"); /* nSel Leitung abschalten */
    #asm ("nop");
    
    // Hingen noch Reste im Puffer ? oder Puffer Überlauf -> Dann löschen    
    if((uc_buffer=='$')||(uc_receivebyte>125))
    {
        uc_receivebyte=1;
        uc_receivebuffer[0]='$';     /* Das Erste Byte des Empfangspuffers mit $ beschreiben*/
        uc_receivebuffer[1]=0;             /* Ein Stringende anfügen*/
    }
    else
        {
        uc_receivebuffer[uc_receivebyte]=uc_buffer;
        uc_receivebyte++;
        uc_receivebuffer[uc_receivebyte]=0; /* Stringende anfügen */
        };
         
    if (uc_buffer==10) /* Line Feed wurde empfangen*/ 
    {
        reset_fifo();
        uc_check=checksum();
                               
        if (uc_check==0)
        {
            newstring=1;
        };
        uc_receivebyte=0;
    }
}