Im Prinzip ist es so wie Du schreibst
Ich schick Dir mal nen "C" Programmcode wie ich es gemacht hab
Zuerst der Sender:
Nun die Teile vom Empfängercode: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 */ }
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; } }







Zitieren
Lesezeichen