Autor Tema: Recibir SMS con PIC16f877A y SIM800L  (Leído 1575 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6906
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #30 en: 26 de Julio de 2018, 23:46:35 »
No se donde es que ve que posiblemente exista una re-entrada, pero es cualquiera el warning que tira.

Desconectado martinchd

  • PIC10
  • *
  • Mensajes: 37
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #31 en: 28 de Julio de 2018, 09:41:09 »
La verdad que me esta haciendo renegar bastante... ya me ira a salir.    :D :D :D :D :D

Desconectado martinchd

  • PIC10
  • *
  • Mensajes: 37
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #32 en: 08 de Agosto de 2018, 11:19:47 »
No me doy cuenta en que me estoy equivocando, no puedo recibir SMS.

Código: C
  1. #include <16F877a.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #use delay(clock = 4000000)
  5. #fuses XT,NOWDT,NOLVP
  6. #use fast_IO(B)  
  7. #use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
  8. #include <lcd.c>
  9.  
  10. char bufferRX[2][17];
  11. int8 indiceBuff = 0;
  12. int8 indice = 0;
  13. int1 mostrar;
  14.  
  15. #int_rda
  16. void serial_isr() {
  17.  
  18.   if(kbhit()){
  19.     bufferRX[indiceBuff][indice] = getc();
  20.     indice++;
  21.     if(indice >= sizeof bufferRX)
  22.     {
  23.       indice = 0;
  24.       bufferRX[indiceBuff][16] = '\0'; //Una proteccion por las dudas
  25.       indiceBuff ^= 1;
  26.       mostrar = 1;
  27.     }
  28.   }
  29. }
  30.  
  31.  
  32. void main()
  33. {
  34.    
  35.     set_tris_b(0x00);
  36.     lcd_init();
  37.     delay_ms(200);
  38.     printf(lcd_putc,"Please wait... \n");
  39.     delay_ms(9000); //Tiempo hasta que inicie SIM00L
  40.     printf(lcd_putc," \fEsperando SMS... \n");
  41.    
  42.     enable_interrupts(int_rda);
  43.     enable_interrupts(global);
  44.    
  45.     printf("AT+CNMI=2,2,0,0,0");
  46.     printf("AT+CMGF=1");
  47.    
  48.     while(TRUE)
  49.     {
  50.       if(mostrar)
  51.       {
  52.         mostrar = 0;
  53.         printf(lcd_putc,"\f%s",&bufferRX[indiceBuff^1][0]);
  54.       }
  55.     }
  56. }



Desconectado martinchd

  • PIC10
  • *
  • Mensajes: 37
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #33 en: 03 de Septiembre de 2018, 18:44:00 »
Hola.. retome con el proyecto, conecte el modulo a HyperTerminal y cuando llega un sms el modulo manda por puerte serie esto:

+CMT: "+5493534xxxxxx","","18/09/01,19:14:34-12"
Prueba

lo estoy haciendo por interrupcion y cuando llega el sms al puerto UART lo almaceno en un buffer. lo que no sabria es en que posicion del buffer comienza el cuerpo del sms.

Código: C++
  1. #include <16F877a.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #use delay(clock = 4000000)
  5. #fuses DEBUG,XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOCPD
  6. #use fast_io(a)
  7. #use fast_io(b)  
  8. #use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
  9. #include <lcd.c>
  10.  
  11. char dato [80];
  12. int a=0;
  13. int b=0;
  14. char c=0;
  15.  
  16. #int_rda
  17. void serial_isr ()
  18.    {
  19.     if (kbhit())
  20.       {
  21.        c=getc();
  22.        dato[b]=c;
  23.        b++;
  24.       }
  25.    }
  26.    
  27. void borrar_array()
  28.    {
  29.      for(a=0;a<75;a++)
  30.       {
  31.       dato[a]=0;
  32.       delay_ms(50);
  33.       }
  34.    a=0;
  35.    b=0;
  36.    c=0;
  37.    }
  38.  
  39. void main()
  40.    {
  41.    
  42.    set_tris_a (0x00) ;
  43.    output_high(pin_a3);     // Tiempo hasta que toma señal el modulo
  44.       delay_ms(3000);      
  45.    output_low(pin_a3);      
  46.       delay_ms(3000);      
  47.    output_high(pin_a3);
  48.       delay_ms(3000);  
  49.    output_low(pin_a3);
  50.       delay_ms(3000);
  51.    output_high(pin_a3);
  52.       delay_ms(3000);  
  53.    output_low(pin_a3)
  54.    ;
  55.    enable_interrupts(global);
  56.    enable_interrupts(int_rda);
  57.    
  58.    printf("AT+CMGF=1\n\r");
  59.    printf("AT+CNMI=2,2,0,0,0\n\r");
  60.    printf("AT+CMGL=1,4\n\r"); //BORRAMOS SMS
  61.    borrar_array();
  62.    
  63.    
  64.    while(true)
  65.     {
  66.      
  67.       if(dato[75]=='D' &&dato[76]=='a' &&dato[77]=='t' &&dato[78]=='o')
  68.       {
  69.       output_high(pin_a3);
  70.       delay_ms(3000);delay_ms(3000);delay_ms(3000);  
  71.       output_low(pin_a3);
  72.       printf("AT+CMGL=1,4\n\r"); //BORRAMOS SMS
  73.       borrar_array();
  74.       }
  75.      
  76.     }  
  77.    }
  78.    


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6906
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #34 en: 03 de Septiembre de 2018, 22:44:07 »
podes contar las comas, esperar un CR LF... Va a depender del la respuesta del SIM800.

Desconectado martinchd

  • PIC10
  • *
  • Mensajes: 37
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #35 en: 04 de Septiembre de 2018, 18:43:36 »
se puede hacer también con strstr() ??? de esta forma?

Código: C++
  1.  while(true)
  2.     {
  3.      
  4.       if(strstr(sms_in,dato)!=NULL)
  5.       {
  6.       output_high(pin_a3);
  7.       delay_ms(3000);delay_ms(3000);delay_ms(3000);  
  8.       output_low(pin_a3);
  9.       printf("AT+CMGD=1,4\n\r"); //BORRAMOS SMS
  10.       borrar_array();
  11.       }
  12.      
  13.     }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6906
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #36 en: 04 de Septiembre de 2018, 23:57:55 »
Si podrias.

Pero para que funcione tu ejemplo se deben cumplir dos cosas.

1 - sms_in debe estar completo antes de entrar en el while, sino no tiene sentido.
2 - Se supone que tu substring (dato) se encuentra una unica ves en sms_in, y sea "especial" y unico.

Desconectado martinchd

  • PIC10
  • *
  • Mensajes: 37
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #37 en: 05 de Septiembre de 2018, 09:42:14 »
A estar completo te referís a que el string que tiene que tener la cantidad de caracteres que le declaro ? porque ese es el motivo por el cual no puedo hacerlo por ubicación en el string, porque no logro saber cual es la longitud del string, sabiendo que el modulo de devuelve esto. -> 

+CMT: "+5493534xxxxxx","","18/09/01,19:14:34-12"
Dato



Si si.. la palabra Dato, va a estar una sola vez en el string.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6906
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #38 en: 05 de Septiembre de 2018, 12:25:14 »
Citar
A estar completo te referís a que el string que tiene que tener la cantidad de caracteres que le declaro ?

Me refiero a que que pasaria si en el array tenes mas cosas supongamos esto y Dato no completo.
Código: [Seleccionar]
+CMzz: Zzzz,zzz,zzzzzzzzz,zzzzzzzzz,zzzzz,zzzz,zzz
+CMT: "+5493534xxxxxx","","18/09/01,19:14:34-12"
Da

No se como llenas el array vos, pero supongamos que llenas desde el 0 hasta el maximo del array y volves a llenar desde 0, te puede suceder esto:

Código: [Seleccionar]
to+CMzz: Zzzz,zzz,zzzzzzzzz,zzzzzzzzz,zzzzz,zzzz,zzz
+CMT: "+5493534xxxxxx","","18/09/01,19:14:34-12"
Da

La unica que se me ocurre es... Esperar por +CMT, cuando se encuntre CMT, esperar por el CR o LF que envia antes del mensaje, Encontrado cualquiera de los 2 caracteres empezar a guardar en un array el mensaje.

Pero esto lo trabajas en la interrupcion cuando esta llegando el mensaje letra a letra, y no tomar todo junto.

Desconectado martinchd

  • PIC10
  • *
  • Mensajes: 37
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #39 en: 05 de Septiembre de 2018, 14:01:23 »
el CR y LF, en que posición es que llega en el mensaje?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6906
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #40 en: 05 de Septiembre de 2018, 17:32:06 »
Antes de "Dato", y luego de cualquier respuesta del SIM800


+CMzz: Zzzz,zzz,zzzzzzzzz,zzzzzzzzz,zzzzz,zzzz,zzz   <- Aca un CR LF
+CMT: "+5493534xxxxxx","","18/09/01,19:14:34-12" <- Aca un CR LF
Dato <- Aca un CR LF
OK  <- Aca un CR LF

Desconectado martinchd

  • PIC10
  • *
  • Mensajes: 37
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #41 en: 05 de Septiembre de 2018, 20:00:23 »
Esta mal esta interrupción para que solo me guarde en el buffer lo que yo quiero.

Código: C++
  1. #int_rda
  2. void serial_isr ()
  3.    {
  4.     if (kbhit())
  5.       {
  6.        c=getc();
  7.       if (c=="D"){sms_in [0]=c;}else continue;
  8.       if (c=="a"){sms_in [1]=c;}else continue;
  9.       if (c=="t"){sms_in [2]=c;}else continue;
  10.       if (c=="o"){sms_in [3]=c;}else continue;
  11.        
  12.       }
  13.    }
« Última modificación: 06 de Septiembre de 2018, 08:21:54 por martinchd »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6906
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #42 en: 06 de Septiembre de 2018, 08:35:25 »
Que pasaria con tu codigo si te llega esto:

Código: [Seleccionar]
Dxxxxxaxxxxxtxxxxxo
Si vas a esperar Dato perfectamente y queres lo mas simple de realizar, entonces:

Código: C
  1. #int_rda
  2. void serial_isr ()
  3.    {
  4.     if (kbhit())
  5.       {
  6.         sms_in[0] = sms_in[1];
  7.         sms_in[1] = sms_in[2];
  8.         sms_in[2] = sms_in[3];
  9.         sms_in[4] = getc();
  10.         sms_in[5] = 0x00;
  11.         if(!strcmp(sms_in,"Dato"))
  12.         {
  13.           //Llego Dato
  14.         }
  15.       }
  16.    }

Lo anterior se puede realizar con un memcpy, pero es para que lo veas

Desconectado martinchd

  • PIC10
  • *
  • Mensajes: 37
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #43 en: 06 de Septiembre de 2018, 10:05:21 »
porque decis que me puede llegar otro tipos caracteres erróneos, el modulo no manda bien la información, las veces que lo probé en el hyperterminal, me envía bien la informacion.


Desconectado martinchd

  • PIC10
  • *
  • Mensajes: 37
Re:Recibir SMS con PIC16f877A y SIM800L
« Respuesta #44 en: 06 de Septiembre de 2018, 10:15:07 »
Debo tener algún problema en la recepción de la información, proveniente de modulo, porque trato de imprimir el buffer para ver que me llega y no me imprime nada.