Hola, estoy usandon parte del codigo de RedPic para capturar una serie de tramas a traves de UART usando la inetrrupcion #int_rda, el problema es que la interrupcion solo es atendida la primera ves, cuando se produce una segunda interrupcion el pic queda congelado. Aqui esta mi codigo, hay algo que estoy haciendo mal????
#include <18F452.h>
#include <string.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT
#use delay(clock=20000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar
// CONSTANTES /////////////////////////////////////////////////////////////////
int const lenbuff=32; // Longitud de buffer, Ajustar
// a lo que desees (o te sea posible)
// VARIABLES EN RAM ///////////////////////////////////////////////////////////
int xbuff=0x00; // Índice: siguiente char en cbuff
char cbuff[lenbuff]; // Buffer
char rcvchar=0x00; // último carácter recibido
char flagcommand=0; // Flag para indicar comando disponible
char SMS_OK= 0;
char flag = 0;
// Declaración de Funciones ///////////////////////////////////////////////////
void inicbuff(void); // Borra buffer
int addcbuff(char c); // añade carácter recibido al buffer
void echos(char c); // Eco selectivo sobre RS232
void procesa_comando(void); // Procesa comando
// INTERRUPCIONES /////////////////////////////////////////////////////////////
#int_rda
void serial_isr() { // Interrupción recepción serie USART
rcvchar=0x00; // Inicializo carácter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar=getc(); // lo descargo y ...
addcbuff(rcvchar); // lo añado al buffer y ...
}
}
void inicbuff(void){ // Inicia a \0 cbuff -------------------
int i;
int count=32;
for(i=0;i<count;i++){ // Bucle que pone a 0 todos los
cbuff[i]=0x00; // caracteres en el buffer
}
xbuff=0x00; // Inicializo el índice de siguiente
// carácter
flagcommand = 0;
flag = 0;
}
int addcbuff(char c){ // Añade a cbuff -----------------------
switch(c){
case 0x0A: // Enter -> Habilita Flag para procesar
if (flag == 3 )
flagcommand=1;
else
flag++;
break;
default:
cbuff[xbuff++]=c; // Añade carácter recibido al Buffer
}
}
void Verifica_Trama(){
char xcommand[12];
flagcommand=0;
strcpy(xcommand,"\r$SMS:3\r\rOK\r");
if(!strcmp(cbuff,xcommand))
SMS_OK=1;
else
SMS_OK=0;
}
// Programa Principal /////////////////////////////////////////////////////////
void main() {
enable_interrupts(int_rda); // Habilita Interrupción RDA
enable_interrupts(global);
delay_ms(200);
do{
SMS_OK = 0;
inicbuff();
printf("AT+SMS\r\n");
flag = 0;
delay_ms(100);
while (flagcommand == 0);
Verifica_Trama();
}while (SMS_OK == 0);
printf("Mensaje Recibido");
}