Si MLO
Pero no tengo idea como hacerlo
Bueno ya poco a poco parece que esta saliendo...
Hola, hace algun tiempo implemente un sistema que enviaba y recibia SMS, te puedo dar unas pautas, la recepcion de datos del movil (SIM340) la hacia por interrupcion del Usart, este modulo GSM cuando recibia una llamada enviaba al PIC la palabra RING, seguida de 0x0D 0X0A y luego enviaba la palabra "OK" 0x0d 0x0A, el detalle es que en la interrupcion del usart solo discriminaba la recepcion del caracter 0x0A que me servia para saber que terminaba de recibir una trama, a continuacion de pongo parte de mi codigo.
#INT_RDA
void recepcion_rxd(){
char rcvchar=0x00; // último caracter recibido
if(kbhit()){ // Si hay algo pendiente de recibir ...
rcvchar=getc(); // lo descargo y ...
add_2_cbuff(rcvchar); // lo añado al buffer y ...
}
}
// Añade a cbuff -----------------------
void add_2_cbuff(char c){
switch(c){
case 0x0A: // Enter -> Habilita Flag para procesar comando
cnttrama--;
if(cnttrama==0){
flagresp=1;}
break;
case 0x0D:
break;
case 0x3E: //simbolo ">" que es la habilitacion para escribir SMS
break;
default: // Añade caracter recibido al Buffer
if (xbuff<=78){
cbuff[xbuff++]=c;}
else if ((xbuff>=79)&&(xbuff<=101)){
smsbuff[(xbuff++)-79]=c;}
else{
smsbuff[18]=c;}
CNTRXD++;
}
}
//Esto de acontinuacion es parte del programa principal, que tu tendras que adaptarlo, pero que facilmente se entiende.
//los caracteres los recibo en cbuff[], cnttrama es "el contador de tramas" que me indica cuantas veces espero recibir el
//caracter 0X0A
//CNTRXD es el contador de Recepcion de caracteres o bytes.
if((cnttrama==2)&&(cbuff[0]!='R')&&(cbuff[1]!='I')&&(cbuff[2]!='N')&&(cbuff[3]!='G')){
ver_respuesta(10,709);
if(flagerror){
//escribo codigo para cuando no envie ring
}
else{
//escribo codigo para RING
}
}
// esto es algo similar a la funcion de comparar cadenas, solo que preferi usar una propia
// contador es la cantidad de bytes que comparo (desde el byte numero 0)
// suma, me indica la suma de todos esos bytes, si coinciden solo los caracteres esperados.
// flagerror es un bit que indica se hubo error; si esta en 1 es que hubo error, si esta en 0 esta OK
// led_sal es un led que me indicaba que la respuesta esta OK
// led_est es un led que me indicaba que la respuesta es erronea
void ver_respuesta(int contador,int32 suma){
cont0=0;
chksuma=cbuff[cont0];
do{
chksuma=chksuma+cbuff[cont0+1];
cont0++;
}while(cont0<contador-1);
if (chksuma==suma){
led_sal=1;
flagerror=0;
errcnt=0;
delay_ms(200);
led_est=0;
led_sal=0;}
else{
flagerror=1;
led_sal=0;
led_est=1;
errcnt++;
if ((errcnt>=50)&&(flagsenial==1)){
init_smsbuff(); // Borra buffer al inicio
rngcnt=0;
inactivo=0;
esperar_ring(); //Vuelvo a esperar los ring.
}
delay_ms(200);
led_est=0;}
CNTRXD=0;
}
//espero te sirva porque yo lo use sin problemas.
//Cualquier consulta me avisas.