#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");
}