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;
}
}
Lesezeichen