a qui les mando unfragmento de codigo a ver si les sirve a los que estamn realizando algo similar a lo que hice, este recibe mensajes los llee y despues los interpreta del modem gsm:
#include <18f2550.h>
#fuses hs,noprotect, mclr,nowdt
#use delay(internal=4M)//delay(clock=4000000)k
#use rs232(baud=9600, xmit=PIN_c6,rcv=PIN_c7,STREAM=MODEM)
#use rs232(baud=9600, xmit=PIN_B5,rcv=PIN_B6,STREAM=DEVICES)
#use rs232(baud=9600, xmit=PIN_c0,rcv=PIN_c1,STREAM=MASTER)
#include <string.h>
#include <math.h>
//#include <input.c>
#define mensaje pin_a0
#define relay pin_a1
#define RESET pin_a2
#define ALARM pin_b3
#define on output_high
#define off output_low
//#priority EXT1,RDA
/////////////////////////////////////////////////////////////////////////////////////////
INT STRING[300]=" ",modo=0,dispositivos[]="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",num[]="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
INT OK[]="OK",ERROR[]="ERROR",RING[]="RING",CMTI[]="+CMTI:",ON[]="ON",OFF[]="OFF",ESTADO[]="DISPOSITIVOS?",VARIABLES[]="VARIABLES?",varis[]="voltaje=0,temperatura=0,pocicion=0";
int1 listo=0,captura_cadena=1;
char a=0,b=0,s0[]="off",s1[]="off",s2[]="off",s3[]="off";
int x,estado_dispositivo,FOCOS=0;
//////////////////////////////////////////////////////////////////////////////////////
const int mensaje_leido=1,RESETEAR=2;
//////////////////////////////////////////////////////////////////////////////////////
int1 verificar_estado(int estados,int disp);
void asignar_estados(char modo);
int1 verificar_falla(int cont);
//////////////////////////////////////////////////////////////////////////////////////
VOID MAIN()
{
enable_interrupts(int_rda);
enable_interrupts(int_ext1);
enable_interrupts(int_ext2);
enable_interrupts(global);
ON(RESET);
for(x=0;x<16;x++)
num
CICLO:
GOTO CICLO;
}
//////////////////////////////////////////////////////////////////////////////////////////
#int_rda
void capturar()
{
if(kbhit()!=0)
fgets(string,modem);
if(strcmp(string,RING)==0)
{
fputs("ATA",modem);
on(relay);
}
else if((strncmp(string,ON,2)==0)||(strncmp(string,OFF,3)==0))
{
if(strncmp(string,ON,2)==0)
dispositivos[0]='A';
else if(strncmp(string,OFF,3)==0)
dispositivos[0]='B';
for(x=1;x<12;x++)
dispositivos
for(x=1;x<12;x++)
{
dispositivos
}
MODO=MENSAJE_LEIDO;
}
else if(strcmp(string,OK)==0)
{
output_high(pin_b7);
switch(modo)
{
case mensaje_leido:
for(x=0;x<12;x++)
fputc(dispositivos
delay_ms(610);
/* if(!verificar_falla(11))
goto MEN;*/
fputs("AT+CMGD=1,4",modem);///////////////////////////borra los mensajes leidos
modo=resetear;
off(mensaje);
break;
case RESETEAR:
if(listo==1)
{
modo=0;
captura_cadena=0;
if(focos==1)
asignar_estados(';');
else if(focos==2)
asignar_estados('*');
MEN:
fprintf(modem,"AT+CMGS=\"%s\"%c",num,13);
delay_ms(1000);
if(focos==1)
fprintf(modem,"foco0=%s;\nfoco1=%s;\nfoco2=%s;\nfoco3=%s%c",s0,s1,s2,s3,26);
else if(focos==2)
fprintf(modem,"%s%c",varis,26);
focos=0;
}
delay_ms(300);
listo=0;
off(reset);
break;
}
}
else if(strcmp(string,ERROR)==0)
{
output_low(pin_b7);
off(mensaje);
}
else if(strncmp(string,CMTI,6)==0)
{
a=b=0;
a=string[12];
b=string[13];
fprintf(modem,"AT+CMGR=%c%c%c",a,b,13);
modo=mensaje_leido;
on(mensaje);
}
else if(strcmp(string,ESTADO)==0)
{
listo=1;
FOCOS=1;
}
else if(strcmp(string,VARIABLES)==0)
{
listo=1;
FOCOS=2;
}
}
///////////////////////////////////////////////////////////////////////////////////////////
#INT_EXT1
void alarma()
{
if(input(alarm))
{
fputs("AT",modem);
delay_ms(200);
fprintf(modem,"ATD%s;%c",num,13);
delay_ms(9000);
fputs("ATH",MODEM);
delay_ms(300);
OFF(RESET);
}
}
//////////////////////////////////////////////////////////////////////////////////////////
#INT_EXT2
void actualizar()
{
char comand=0;
comand=fgetc(master);
if(comand==10)
{
fgets(num,master);
for(x=0;x<16;x++)
write_eeprom(x,num
}
if(comand==11)
{
fgets(dispositivos,master);
for(x=0;x<2;x++)
fputc(dispositivos
}
delay_ms(100);
OFF(RESET);
}
//////////////////////////////////////////////////////////////////////////////////////////
int1 verificar_estado(int estados,int disp)
{
int resultado=0;
int1 bool=0;
int and=0;
resultado=pow(2,disp);
and=estados&resultado;
if(and==resultado)
bool=1;
else
bool=0;
return bool;
}
/////////////////////////////////////////////////////////////////////////////////////////
void asignar_estados(char modo)
{
estado_dispositivo=0;
fputc(modo,devices);
if(modo=='*')
fgets(varis,devices);
else if(modo==';')
{
estado_dispositivo=fgetc(devices);
for(x=0;x<4;x++)
{
switch(x)
{
case 0:if(verificar_estado(estado_dispositivo,x)==1) strcpy (s0,ON);
else strcpy (s0,OFF);
break;
case 1:if(verificar_estado(estado_dispositivo,x)==1) strcpy (s1,ON);
else strcpy (s1,OFF);
break;
case 2:if(verificar_estado(estado_dispositivo,x)==1) strcpy (s2,ON);
else strcpy (s2,OFF);
break;
case 3:if(verificar_estado(estado_dispositivo,x)==1) strcpy (s3,ON);
else strcpy (s3,OFF);
break;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int1 verificar_falla(int cont)
{
int1 res=false;
int y;
fputc(';',devices);
estado_dispositivo=fgetc(devices);
for(y=1;y<cont;y++)
{
if((dispositivos[y]>='0')&&(dispositivos[y]<='9'))
{
if(verificar_estado(estado_dispositivo, dispositivos[y]-48)&&dispositivos[0]=='A')
res=true;
else if(!verificar_estado(estado_dispositivo, dispositivos[y]-48)&&dispositivos[0]=='B')
res=true;
else
{
res=false;
goto salir;
}
}
}
SALIR:
return res;
}