Ayuda con recepcion de string RS232

Hola, estoy tratando de comunicar una pic 16f877a con el pc a traves del puerto serie, con el fin de encender o apagar un led mediante un mensaje. Si envio el mensaje ON el led se enciende, si envio el mensaje OFF el led se apaga. Al principio se enciende el led con el primer mensaje, pero al momento de enviar el segundo mensaje, este se queda pegado en la rutina de main. Le he dado mil vueltas y no logro ver donde esta el problema. Si me pudieran ayudar por favor. Gracias :)

Código:
#include <16f877A.h>
#use  delay(clock=20000000)
#fuses xt,nowdt,nobrownout,nolvp,noprotect   // Fusibles
#use  rs232 (baud=9600, bits=8, parity=N,xmit=PIN_C6,rcv=PIN_C7)
#define use_portb_lcd TRUE
#include "lcd420.c"
#include <stdlib.h>
#byte TRISA = 0x85
#byte PORTA = 0x05

int i;
char  dato[10]={0};
char c;

#INT_RDA  
void mensaje(){  
disable_interrupts(int_rda);
i=0;
if(kbhit()){

      while(c!='\r')
         {  
         c=getc();
         dato[i]=c;
         i++;
         }
      }
enable_interrupts(int_rda);
}


void muestra_lcd(void){
      lcd_putc('\f');
      for(i=0;i<11;i++)
         {
         printf(lcd_putc,"%c",dato[i]);
         }
      if(dato[0]=='O'&&dato[1]=='N')
      output_high(PIN_A1);
      if(dato[0]=='O'&&dato[1]=='F'&&dato[2]=='F')
      output_low(PIN_A1);
            
for(i=0;i<11;i++)
   dato[i]=0;
   
delay_ms(800);
}

void  main()
{
      lcd_init();                      // inicializa el lcd
      set_tris_a(0x00);                //puerto A como salida 
      output_a(0x00);                  // salida a 0 del puerto A
      lcd_putc("Inicializando");
      delay_ms(1000);
      lcd_putc('\f');
      output_high(PIN_A0);
      delay_ms(500);
      output_low(PIN_A0);
      enable_interrupts(int_rda); 
       enable_interrupts(global); 
       
        while(TRUE)
         {
            lcd_putc('\f');
            lcd_putc("ESCRIBE");
            delay_ms(500);
            lcd_putc('\f');
            lcd_putc("EL MENSAJE");
            delay_ms(500);
            output_high(PIN_A0);
            delay_ms(200);
            output_low(PIN_A0);
            delay_ms(200);
           if(dato[0]!=0)
           muestra_lcd();
         }
}
 
Atrás
Arriba