#include <18f4431.h>
#include <string.h>
#fuses intrc,nomclr,t1lowpower,noprotect,noput,nowdt,nobrownout,nolvp
#use delay (clock=4Mhz)
#use rs232 (baud=9600,xmit=pin_c6,rcv=pin_c7,parity=n,bits=8)
int const lenbuff=100;
int pregunta=0;
int xbuff=0x00,flagcommand=0,final=0,a=0,v=0;
char cbuff[lenbuff];
char rcvchar=0x00;
char pos_sms=0x00;
char telefono[10];
void inicbuff(void);
void procesa_comando(void);
#int_rda
void comunica(){
rcvchar=0x00;
if (kbhit()){
rcvchar=getc(); // recojo dato que me llega del puerto serie.
if(rcvchar!=0x0a){ //si es el caracter de inicio de linea, no lo acumulo en la cadena cbuff.
if (xbuff<100){
cbuff[xbuff++]=rcvchar; //introduzco el caracter recibidi del rs-232 en una nueva posicion de la cadena.
printf("introduce en cbuff=%s\n\r",cbuff); //esto es para ir viendo yo si se introducia bien.
}
}
if(rcvchar==0x0d){ //si recibo un intro, hago lo siguiente.
final++; //incremento la variable final
if(pregunta){ //si la variable pregunta está a "1", necesito recoger cuatro (intros) para irme a procesar la trama.
printf("pregunta=1");
if(final==4){
flagcommand=1;
final=0;
pregunta=0;
}
}
else{
printf("pregunta=0"); //si pregunta está a cero, solo necesito recoger 2 (intros ) para procesar la trama.
if(final==2){
flagcommand=1; //Nota: todo esto es porque si al modem yo no le pregunto nada, solo me puede enviar una trama cuando se le manda un mensaje
final=0; //por movila que es +cmti: "mt",X donde X me da la posicion en el cual se ha guardado el mensaje recibido en el gsm. Pues bien, esta trama
}
} //que el modem me envia está siempre contenida entre dos intros.
} //Cuando yo la recibo, lo que hago es recoger la posición donde se ha guardado el sms, y preguntarle al modem para que me lo envíe.
} //la trama que el modem me envía esta vez, está contenida entre cuatro intros, y por lo tanto, cuando yo pregunto al modem por el sms
} //mediante at+cmgr=X pongo a uno la variable pregunta para no procesar la trama hasta que haya recibido los cuatro intros.
void main (){
inicbuff(); //incio la cadena que va ha guardar la trama
for (a=0;a<10;a++){
telefono[a]='\0';
}
enable_interrupts(int_rda);
enable_interrupts(global);
delay_ms(5000);
printf("inicia");
do{
if(flagcommand){
flagcommand=0;
disable_interrupts(int_rda);
procesa_comando();
inicbuff();
printf("cbuff del while=%s\n\r",cbuff);
enable_interrupts(int_rda);
}
}while(true);
}
void inicbuff(void)
{
int i;
for(i=0;i<lenbuff;i++){
cbuff[i]='\0';
}
xbuff=0x00;
}
void procesa_comando(void){
char *retorno1;
char *retorno2;
char *coma;
char *clave;
char *numero;
char string1[10];
char string2[10];
char string3[10];
char s1[10];
char s2[10];
char s3[10];
int i=0;
for (i=0;i<10;i++){ //pongo los strings a cero
s1[i]='\0';
s2[i]='\0';
s3[i]='\0';
numero[i]='\0';
string1[i]='\0';
string2[i]='\0';
string3[i]='\0';
}
//NUEVO MENSAJE RECIBIDO.........................
strcpy(string1,"+CMTI:"); //copio en la cadena STRING1 "+cmti:"
retorno1=strchr(cbuff,0x0d); //posiciono el puntero retorno1 al primer intro recibido
retorno1++; //lo incremento una posición.
strncpy(s1,retorno1,6); //introduzco en la cadena S1 seis caracteres de la cadena cbuff a partir de la posición que me marca el puntero
if (!stricmp(s1,string1)){ //comparo que S1 y String1 sean igual "+cmti:"
coma=strchr(cbuff,0x2c); //pongo el puntero en la posición de la coma de cbuff
coma+=1; //lo incremento para que me apunte al numero donde está guardado el mensaje del modem
pos_sms=*coma; //copio el numero al que apunta en el char pos-sms
printf("AT+CMGR=%c\r",pos_sms); //le pregunto para que me envíe el mensaje(el de los cuatro intros).
pregunta=1; //pongo el chivato a "1" para saber que tengo que recibir 4 intros para procesar la trama.
goto fin;
}
// RESPUESTA AL LEER MENSAJE......................
strcpy(string2,"+CMGR:"); //Aqui empezamos el procesamiento de la segunda trama.
printf("valor de string2=%s\n\r",string2); //en definitiva es lo mismo que en la trama anterior, solo que aparte de hacer la comprobación de "+cmgr" desde
retorno2=strchr(cbuff,0x0d); //el primer intro, también busco que el mensaje contenga la palabra "paco" desde la primera P.
printf("valor de buff1=%s\n\r",cbuff); //una vez hechas estas comprobaciones, recojo el numero de telefono del remitente que va contenido en el sms
retorno2++; //el cual se que está 5 posiciones despues de la primera ","=0x2c.
strncpy(s2,retorno2,6);
printf("valor de s2=%s\n\r",s2);
if (!stricmp(s2,string2)){
strcpy(string3,"paco");
printf("valor de string3=%s\n\r",string3);
clave=strchr(cbuff,0x70);
printf("valor de cbuff2=%s\n\r",cbuff);
strncpy(s3,clave,4);
printf("valor de s3=%s\n\r",s3);
if(!stricmp(s3,string3)){
numero=strchr(cbuff,0x2c);
numero=numero+5;
strncpy(telefono,numero,9);
printf("valor de telefono=%s\n\r",telefono);
printf ("el telefono es %s",telefono); //
}
}
fin:
v=0;
}
// Pues el proble es que la primera trama siempre me la analiza bien, pero la segunda solo me la aniza bien la primera vez, o sea, cuando reinicio el pic.
// He observado al concluir los intros y empezar a procesar la trama, que la segunda vez que proceso la trama de cuatro intros, antes de hacer nada leo la cadena cbuff y no esta la trama completa. Ejemplo:
// cbuff bueno=[(intro)+cmgr: "red unread","+34676767789",,"23/10/2007etc...."/(into)paco(intro)ok(intro)]
// cbuff malo =[(intro)+cmgr: "rec unread","+34] por lo tanto faltan muchos caracteres.
// Pues eso es lo que me hace a partir de la segunda vez que hago el proceso completo, y lo gracioso es que yo voy leyendo la cadena cbuff y tengo todos los caracteres, y es cuando entro en VOID PROCESA COMANDO cuando desaparecen todos los caracteres.