Autor Tema: comando AT+CMGS  (Leído 4841 veces)

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

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
comando AT+CMGS
« en: 11 de Abril de 2020, 19:13:28 »
Hola buenas tardes, alguno sabe como mandar un SMS del comando AT+CMGS, con el modulo  SIM800L.
Pero el numero lo tengo guardado en una variable.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:comando AT+CMGS
« Respuesta #1 en: 11 de Abril de 2020, 20:20:54 »
Hay muchisimos tutoriales donde explican como enviar un SMS.

Si la pregunta es ¿que pasa si lo tengo en una variable al numero? entonces la respuesta es , pasalo a string si es un numero, sino cargalo como string y te olvidas, si es un string solo vas a tener que formar el string completo, podes usar sprintf para imprimirlo sobre un string, y luego enviarlo.

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:comando AT+CMGS
« Respuesta #2 en: 11 de Abril de 2020, 20:28:40 »
Hay muchisimos tutoriales donde explican como enviar un SMS.

Si la pregunta es ¿que pasa si lo tengo en una variable al numero? entonces la respuesta es , pasalo a string si es un numero, sino cargalo como string y te olvidas, si es un string solo vas a tener que formar el string completo, podes usar sprintf para imprimirlo sobre un string, y luego enviarlo.



Claro pero como escribo el comando
AT+CMGS="%s",numero

donde "numero", la variable en donde tengo el numero guardado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:comando AT+CMGS
« Respuesta #3 en: 11 de Abril de 2020, 20:49:14 »
Envia:

"AT+CMGF=1\r" //Para modo texto
"AT+CMGS=\"+*********\"\r"  //El numero a enviar
"Mensaje a enviar"   
26   //Esto no es texto, es para indicar el final un Ctrl-Z o SUBSTITUTE, 26 decimal, 0x1A Hexadecimal

Y si... depende que estas usando, si usas CSS que tenes el printf, entonces usa:

printf("AT+CMGS=\"%s\"\r",numero);  // En caso que el numero sea un string con el +549 al frente..

Si usas otro que no tenga el printf, podes usar el sprintf de la misma forma para armarlo, y luego lo envias.

PD: Observa los caracteres de escape \ antes de las comillas "
« Última modificación: 11 de Abril de 2020, 20:52:34 por KILLERJC »

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:comando AT+CMGS
« Respuesta #4 en: 12 de Abril de 2020, 11:55:38 »
probe de esa forma que me dijiste con el string y probe asi

         printf("AT+CMGS=\"%c,%c,%c,%c,%c,%c,%c,%c,%c,%c\"\r",numero1[0],
         numero1[1],numero1[2],numero1[3],numero1[4],numero1[5],numero1[6],
         numero1[7],numero1[8],numero1[9]);


y nada...

 :5]

Desconectado jonathanPIC888

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 326
Re:comando AT+CMGS
« Respuesta #5 en: 12 de Abril de 2020, 12:16:24 »
Como estás, así sería.

fprintf(modem,"AT+CMGS=%c%s%c\r\n\0",34,aux_info,34);

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:comando AT+CMGS
« Respuesta #6 en: 12 de Abril de 2020, 14:51:13 »
Código: C
  1. char numero[] = "+5492222123123";
  2.  
  3. printf("AT+CMGF=1\r");
  4. printf("AT+CMGS=\"%s\"\r",numero);
  5. printf("Probando 1,2,3...");
  6. printf("%c",26);

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:comando AT+CMGS
« Respuesta #7 en: 13 de Abril de 2020, 20:06:30 »
Subo el codigo si alguno me puede ayudar.
Hay veces que me lo envia bien al sms, otras veces no.. alguno se puede dar cuanta en que le estoy errando.


El programa realiza lo siguiente. mide la cantidad de agua de un vaso, la medición la realizo con un sensor ultrasonico, la comunicacion con el usuario es mediante SMS, los SMS para podes ser decodificados tienen que ser enviados entre los carecteres  * mensaje #.




Código: C#
  1. //LCD module connections
  2. #define LCD_RS_PIN PIN_B0
  3. #define LCD_RW_PIN PIN_B1
  4. #define LCD_ENABLE_PIN PIN_B2
  5. #define LCD_DATA4 PIN_B3
  6. #define LCD_DATA5 PIN_B4
  7. #define LCD_DATA6 PIN_B5
  8. #define LCD_DATA7 PIN_B6
  9. //End LCD module connections
  10.  
  11. #include <16F877a.h>
  12. #include <stdio.h>
  13. #include <string.h>
  14. #FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP    
  15. #use delay(clock=4M)
  16. #use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
  17. #USE standard_io(b)                    
  18. #include <lcd.c>
  19.  
  20.  
  21.  
  22. #define trig pin_c4
  23. #define echo pin_c5
  24. #define DQ   PIN_E1    //sensor temp
  25. #USE standard_io(c)
  26. char lluvia_mm[20];  //dato de lluvia caida
  27. char dato_recibido[19],numero1[10]; // Buffer de recepción
  28. int x,num,con_recepcion=0;
  29. float recipiente=126.41;
  30. signed int16 temperature;
  31. char respaldo=0;
  32. float tiempo,distancia;
  33. int flag=0,flagg=0,flaggg=0,flag1=0;
  34.  
  35.  
  36.  
  37.  
  38. void envio_sms_Dato_Lluvia()
  39. {    
  40.                
  41.          if(distancia<=0)
  42.          {                                         // Enviar SMS al numero
  43.          printf("AT+CMGS=\"%s\"\r\n",numero1);
  44.                                                  // Con el texto
  45.          printf("Lluvia caida -> 0.00 mm \n");
  46.          
  47.          delay_ms(100);
  48.                                                  // Se envia el SMS
  49.          putchar(0x1a);
  50.          delay_ms(100);
  51.          printf("\r\n");
  52.          }
  53.          else
  54.          {
  55.          printf("AT+CMGS=\"%s\"\r\n",numero1);
  56.          delay_ms(100);
  57.                                                  // Con el texto
  58.          printf("Lluvia caida -> %s mm\n",lluvia_mm);
  59.          delay_ms(100);
  60.                                                  // Se envia el SMS
  61.          putchar(0x1a);
  62.          delay_ms(100);
  63.          printf("\r\n");
  64.          printf("AT+CMGDA=DEL ALL\r\n"); //BORRAMOS SMS
  65.          delay_ms(1500);
  66.          }        
  67. }
  68.  
  69. void envio_sms_Drenar()
  70. {    
  71.                
  72.                                                  // Enviar SMS al numero
  73.          printf("AT+CMGS=\"%s\"\r\n",numero1);
  74.          delay_ms(100);
  75.                                                  // Con el texto
  76.          printf("Se dreno pluviometro \n Lluvia caida -> %s mm \r\n",lluvia_mm);
  77.          delay_ms(100);
  78.                                                  // Se envia el SMS
  79.          putchar(0x1a);
  80.          delay_ms(100);
  81.          printf("\r\n");
  82.          printf("AT+CMGDA=DEL ALL\r\n"); //BORRAMOS SMS
  83.          delay_ms(1500);
  84.          
  85. }
  86.  
  87. void envio_sms_lluvia()
  88. {    
  89.                
  90.                                                  // Enviar SMS al numero
  91.          printf("AT+CMGS=\"%s\"\r\n",numero1);
  92.          delay_ms(100);
  93.                                                  // Con el texto
  94.          printf("Comenzo a llover \r\n");
  95.          delay_ms(100);
  96.                                                  // Se envia el SMS
  97.          putchar(0x1a);
  98.          delay_ms(100);
  99.          printf("\r\n");
  100. }
  101.  
  102. void envio_sms_Temp()
  103. {
  104.                                                  // Enviar SMS al numero
  105.         printf("AT+CMGS=\"%s\"\r\n",numero1);
  106.         delay_ms(100);
  107.                                                  // Con el texto
  108.         printf("Temp -> %4Ld °C ",temperature);
  109.         delay_ms(100);
  110.                                                  // Se envia el SMS
  111.         putchar(0x1a);
  112.         delay_ms(100);
  113.         printf("\r\n");
  114. }
  115.  
  116. void envio_sms_drenaje()
  117. {
  118.                                                  // Enviar SMS al numero
  119.          printf("AT+CMGS=\"%s\"\r\n",numero1);
  120.          delay_ms(100);
  121.                                                  // Con el texto
  122.          printf("Pluviometro se dreno, llego a 90 mm \r\n");
  123.          delay_ms(100);
  124.                                                  // Se envia el SMS
  125.          putchar(0x1a);
  126. }
  127.  
  128. void envio_sms_1()
  129. {
  130.                                                  // Enviar SMS al numero
  131.          printf("AT+CMGS=\"9999999999\"\r\n");
  132.          delay_ms(100);
  133.                                                  // Con el texto
  134.          printf("Num1 -> %s",numero1);
  135.          delay_ms(100);
  136.                                                  // Se envia el SMS
  137.          putchar(0x1a);      
  138. }
  139.  
  140. void open_valvula()
  141. {
  142.          output_low(pin_c3);
  143.          printf(lcd_putc, "\f");
  144.          delay_ms(25000);
  145.          output_high(pin_c3);
  146.          lcd_init();
  147. }
  148.  
  149. void decodificar()
  150. {
  151.  
  152.         if(dato_recibido[2] == 'u' && dato_recibido[7] == '1') //SMS *numero1:#
  153.                 {    
  154.                       flag1=1;
  155.                       con_recepcion = 0;        
  156.                 }
  157.         if(dato_recibido[2] == 'a' && dato_recibido[3] == 't')   // SMS *Dato#
  158.                 {
  159.                        flag=1;
  160.                        con_recepcion = 0;
  161.                 }
  162.  
  163.         if(dato_recibido[2] == 'r' && dato_recibido[3] == 'e')  //SMS *Drenar#
  164.                 {
  165.                        flagg=1;
  166.                        con_recepcion = 0;
  167.                 }
  168.                
  169.         if(dato_recibido[2] == 'e' && dato_recibido[3] == 'm')  //SMS *Temp#
  170.                 {
  171.                        flaggg=1;
  172.                        con_recepcion = 0;
  173.                 }                              
  174. }  
  175.  
  176. void borrar_dato_recibido()     //Borrar buffer dato_recibido
  177. {
  178.        for(x=0;x<=19;x++)
  179.           {
  180.             dato_recibido[x]=0;
  181.             delay_ms(10);
  182.           }
  183. }
  184.  
  185. void borrar_numero1()
  186. {
  187.        for(num=0;num<=9;num++)
  188.               {
  189.               numero1[num]=0;
  190.               delay_ms(10);
  191.               }
  192. }
  193.  
  194. void ow_reset(void)
  195. {
  196. output_low(DQ);
  197. delay_us(500);          // Min. 480uS
  198. output_float(DQ);
  199. delay_us(500);          // Wait for end of timeslot
  200. }
  201.  
  202. int8 read_bit(void)             // Read bit on one wire bus
  203. {
  204. output_low(DQ);
  205. delay_us(1);          
  206. output_float(DQ);
  207. delay_us(12);          // Read within 15uS from start of time slot
  208. return(input(DQ));    
  209. }                        
  210.  
  211. int8 read_byte(void)
  212. {
  213. int8 i;
  214. int8 val = 0;
  215.  
  216. for(i=0 ; i<8 ; i++)
  217.    {
  218.     if(read_bit()) val |= (0x01 << i);
  219.        delay_us(120);  // To finish time slot
  220.    }
  221.  
  222. return val;
  223. }
  224.  
  225. void write_byte(int8 val, int8 power_on)
  226. {
  227. int i;
  228.  
  229. for(i=0; i<8; i++)
  230.    {
  231.     output_low(DQ);
  232.     delay_us( 2 );  
  233.     output_bit(DQ, shift_right(&val,1,0));  
  234.  
  235.     delay_us(60);
  236.  
  237.     if((i == 7) && (power_on == 1))
  238.       {
  239.        output_high(DQ);
  240.       }
  241.     else
  242.       {
  243.        output_float(DQ);
  244.        delay_us( 2 );  
  245.       }
  246.    }
  247. }
  248.  
  249.  
  250. #int_rda                                //Vector de interrupcion de la recepcion de datos
  251. void interrupcion_rx()                  //por el usart
  252. {
  253.        
  254.         respaldo = getc();
  255.        
  256.         if(respaldo == '*')
  257.                 {con_recepcion = 0;}
  258.                                
  259.         dato_recibido[con_recepcion] = respaldo;
  260.                                
  261.         if(respaldo == '#')
  262.                 {decodificar();}
  263.        
  264.         con_recepcion++;
  265.         if(con_recepcion == 19)
  266.                 {con_recepcion=0;}
  267. }
  268.  
  269.  
  270.  
  271. ///////////////////////////////////////////////////////////////////////////////
  272.  
  273.  
  274.  
  275. void main()
  276. {
  277.    lcd_init();
  278.    lcd_gotoxy(1,1);
  279.    printf(LCD_PUTC, "\f     WELCOME  ");
  280.  
  281.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  282.  
  283.    enable_interrupts(global);
  284.    enable_interrupts(int_rda);
  285.    
  286.    set_tris_a (0x00);
  287.    set_tris_b (0b11100010);
  288.    
  289.    delay_ms(5000);
  290.    lcd_gotoxy(1,2);
  291.    printf(LCD_PUTC, "  Iniciando.   ");  
  292.    delay_ms(3000);
  293.    lcd_gotoxy(1,2);
  294.    printf(LCD_PUTC, "  Iniciando.. ");  
  295.    delay_ms(3000);
  296.    lcd_gotoxy(1,2);
  297.    printf(LCD_PUTC, "  Iniciando...");
  298.  
  299.    delay_ms(5000);
  300.    printf("AT+CMGF=1\r\n");           //Habilita el modo texto de los sms
  301.    delay_ms(15);
  302.    printf("AT+CNMI=2,2,0,0,0\r\n");   //Los sms se envían directamente al puerto serie
  303.    delay_ms(15);
  304.    printf("AT+CMGDA=DEL ALL\r\n");    //Se borran todos los SMS
  305.    delay_ms(15);
  306.  
  307.    borrar_dato_recibido();            //Borramos buffer de recepcion
  308.    borrar_numero1();                  //Borramos buffer de almacenamiento de numero movil
  309.  
  310. while(true)
  311. {
  312.       output_high(trig);                  
  313.       delay_us(10);  
  314.       output_low(trig);
  315.  
  316.    while(!input(echo))                    
  317.      {}
  318.       set_timer1(0);
  319.  
  320.    while(input(echo))                    
  321.      {}
  322.       tiempo=get_timer1();
  323.  
  324.  
  325.    distancia= (recipiente)-(((tiempo/2)/(29.15))*10);  //Calculo matematico de la cantidad de agua que hay en el recipiente.
  326.                                
  327.    lcd_gotoxy(1,2);
  328.    printf(lcd_putc, "   -Agrodata-   ");
  329.    delay_ms(1000);    
  330.    
  331.    if(distancia<=0)
  332.             {
  333.              lcd_gotoxy(1,1);
  334.              printf(lcd_putc,"\fLluvia = 0.00 mm");
  335.             }
  336.    
  337.    if(distancia>=0)
  338.             {
  339.              lcd_gotoxy(1,1);
  340.              printf(lcd_putc,"\fLluvia = %f mm",distancia);
  341.             }  
  342.  
  343.    if(distancia>=90)  //Drena cuando llegue a 90 mm
  344.            {
  345.             envio_sms_drenaje();
  346.             open_valvula();
  347.            }      
  348.                              
  349.    if(flag==1)       // sms dato de lluvia
  350.    {
  351.     sprintf(lluvia_mm,"%f",distancia);            //pasamos variable int a char
  352.     envio_sms_Dato_Lluvia();
  353.     flag=0;
  354.     borrar_dato_recibido();
  355.    }
  356.    
  357.    if(flagg==1)      // sms drenar valvula
  358.    {
  359.     sprintf(lluvia_mm,"%f",distancia);            //pasamos variable int a char
  360.     envio_sms_drenar();
  361.     open_valvula();
  362.     flagg=0;
  363.     borrar_dato_recibido();
  364.    }
  365.    
  366.    if(flag1==1)      // sms numero1
  367.    
  368.    {
  369.                      numero1[0]=dato_recibido[9];   //3
  370.                      numero1[1]=dato_recibido[10];  //5
  371.                      numero1[2]=dato_recibido[11];  //3
  372.                      numero1[3]=dato_recibido[12];  //4
  373.                      numero1[4]=dato_recibido[13];  //1
  374.                      numero1[5]=dato_recibido[14];  //4
  375.                      numero1[6]=dato_recibido[15];  //9
  376.                      numero1[7]=dato_recibido[16];  //5
  377.                      numero1[8]=dato_recibido[17];  //9
  378.                      numero1[9]=dato_recibido[18];  //9
  379.     flag1=0;            
  380.     envio_sms_1();
  381.     borrar_dato_recibido();  
  382.    }
  383. }
  384. }
« Última modificación: 13 de Abril de 2020, 23:17:36 por martinchd »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:comando AT+CMGS
« Respuesta #8 en: 13 de Abril de 2020, 22:09:18 »
Por favor, quita el numero del codigo...

Lo escribo antes de ver el codigo... Hacelo lo antes que puedas..

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:comando AT+CMGS
« Respuesta #9 en: 13 de Abril de 2020, 23:18:47 »
Me había olvidado que tenia el numero ahi. Gracias

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:comando AT+CMGS
« Respuesta #10 en: 25 de Abril de 2020, 19:18:45 »
No se si a alguno le ha pasado, de lo bien que me venia funcionando el programa, es como que no me entra a la interrupcion #INT_RDA, el modulo lo probe con Hyperterminal y funciona bien.
Los SMS me los envia pero no me los lee.. Antes me lo hacia..
Intente cambiar la version sel compilador, estoy trabajando con CCS 4.104.

Desconectado martinchd

  • PIC12
  • **
  • Mensajes: 78
Re:comando AT+CMGS
« Respuesta #11 en: 28 de Abril de 2020, 17:43:30 »
Ya soluciones todo, tenia un problema de conexión entre el micro y el modulo SIM800L.. Quedo todo funcionando.. muchas gracias.

Desconectado carpoolo

  • PIC10
  • *
  • Mensajes: 19
Re:comando AT+CMGS
« Respuesta #12 en: 03 de Junio de 2021, 19:21:21 »
Hola, he estado buscando informacion acerca de los comandos AT y me tope con este post. Aprovecho para hacer una consulta.

En mi caso uso un modulo GSM viejo (SIM5320A) y mi problema radica en el momento de esperar el ">" para poder ingresar el msj. Segundo el datasheet del mismo es necesario para poder ingresar el msj, sin embargo he hecho pruebas en donde no espero el ">" y procedo a enviar el sms de una vez, como resultado en ocasion el mensaje llega incompleto.
 El problema es a veces tarda mucho en aparecer el ">", alguien ha tenido el mismo problema?
 
Gracias de antemano