const int8 iniciodetrama = 0xff;
const int8 ACK = 0xfe;
const int8 ID = 1;
const int8 lenbuffer = 10;
int8 i;
int8 buffer[lenbuffer];
int8 dato=0,recibido=0, analizatrama=0,timeout=0, lentrama=0, checksum=0;
#int_RDA
void RDA_isr(void)
{
clear_interrupt(int_rda);
if(kbhit()){
recibido=1;
}
}
while(1){
if(recibido){ //hay un dato recibido?
if(dato==iniciodetrama&&analizatrama==0){ //es un caracter de inicio de trama?
analizatrama=1; //flag que indica que hay que analizar una trama
timeout=0;
set_timer0(0);
clear_interrupt(int_timer0);
enable_interrupts(INT_TIMER0); //encendemos un timer para timeout
lentrama=0;
i=0; //ponemos en 0 indice
}
buffer[i]=dato; //guarda dato en buffer
++i;++lentrama;
if(i>lenbuffer){i=0;analizatrama=0;buffer[0]=0;}
else if(timeout==0 && lentrama>2&& analizatrama==1 && buffer[0]==iniciodetrama && buffer[1]==ID&&lentrama==buffer[2]){
i=0;analizatrama=0;
checksum=0;
for(i=0;i<lentrama;i++){
checksum^=buffer[i-1];
}
if(checksum==buffer[lentrama-1]){
DELAY_MS(200);
}
}
recibido=0;
}
}