Autor Tema: No puedo MANDAR mensajes desde modulo gprs  (Leído 8211 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #15 en: 20 de Mayo de 2016, 11:41:39 »
no lo tengo probado, pero yo leo esto:

 AT + CMGF = 1 – This command will convert the message style to text. In other words we are telling our shield that we are expecting a text message.
AT+CNMI=1,2,0,0,0 – This command will alert our GSM shield and now whenever it will receive message, it will automatically send an alert on the serial port.

o sea que para que el módulo te alerte que te ha llegado un mensaje tenes que mandar el comando AT+CNMI=1,2,0,0,0

AT+CNMI: New Message indication to TE

Luego de ese comando el celular queda a la espera de mensaje nuevo y te alertará con algo así:

+CMT: "+14038310195","","14/02/03,13:21:37-28"
y el mensaje

aún no he tenido tiempo de probar todo esto. Si puedo el finde pruebo y te comento como me fue.

sds.
-
Leonardo Garberoglio

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #16 en: 20 de Mayo de 2016, 17:10:49 »
El comando es AT+CMGR y el tuyo es AT+CMGF no son los mismos

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #17 en: 20 de Mayo de 2016, 19:50:13 »
ahhhh, es cierto ahi vi el comando.
Lo unico que se me ocurre es que estes guardando los mensajes una de las memorias y estes tratando de leer en otra memoria.
Estas seguro que tenes mensajes recividos?
yo te sugiero que primero pruebes todo con un terminal serie y luego pases al PIC. O sea, conecta el sim900 con un FTDI (usb a uart) y en la PC ejecuta y prueba los comandos. Luego cuando veas que todos funcionan, pasa al PIC...

saludos
-
Leonardo Garberoglio

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #18 en: 22 de Mayo de 2016, 18:54:28 »
GRACIAS por responder ahora estoy tratando de detectar la llegada de un mensaje para ello trato de detectar el + del principio pero no anda, cual es el caracter que manda la sis900 despues de cada linea es el 0x0d o el 0x1a? no entendi lo que dice sobre eso la pagina que me recomendaste

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #19 en: 23 de Mayo de 2016, 08:53:13 »

Next thing I need to do is make sure that I have got the complete string, that was really a tricky part as there’s no end character in the string.
So, I used “\n” null character for that. If you check the string then you can see that we are getting two null characters in complete string.


Por lo visto hay dos caracteres fin de linea \n en la respuesta del modulo... Mas tarde voy a ver si armo el shield y lo pruebo...

Saludos
-
Leonardo Garberoglio

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #20 en: 23 de Mayo de 2016, 18:59:54 »
Fijate si lo poder resolver y me avisas, estoy estancado con eso

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #21 en: 23 de Mayo de 2016, 19:21:31 »
Fijate si lo poder resolver y me avisas, estoy estancado con eso

Y no podes conectarlo a un USB/TTL y ver el hexa que te da cuando te envia algo? para saber que caracteres de mas envia ?

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #22 en: 24 de Mayo de 2016, 10:18:03 »
Si puedo ver que manda pero como son caracteres no imprimibles no se lo que envia al final de cada linea

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #23 en: 24 de Mayo de 2016, 11:21:27 »
Ahí probe el módulo para recivir SMS
Yo lo conecté con un FTDI a la PC y con un programa terminal envío comandos.
Esta es la captura de pantalla:

https://www.dropbox.com/s/ljofiuyz0v8n2ll/Captura%20de%20pantalla%202016-05-24%2011.17.24.png?dl=0

Primero pido que me diga cuanta señal tengo y me responde con 6 (poca señal)
Luego configuro los SMS en modo texto
Luego pido que me alerte cuando llega un mensaje nuevo y me responde OK
Finalmente con el celu mío mando un SMS y al rato, sin que toque nada en el terminal me aparece el mensaje.
El carctaer de fin de línea es \n

Espero te sirva.
Sino, vas a tener que poner el código completo para que lo veamos y podamos ayudarte mejor.

Sds.
-
Leonardo Garberoglio

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #24 en: 24 de Mayo de 2016, 12:29:05 »
 codigo completo
Código: [Seleccionar]
#include <16F88.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES PUT                      //Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#byte PORTA=0X05
#use delay(int=4000000,RESTART_WDT)
#use rs232(uart1, baud=9600)//usart1 -->ajuste de XMIT y RCV para la USART 1
int i=0,j=0;
char Cadena[60]="";
char ch;
int1 LineaPresente=0;
#int_rda
void rd_isr(void)//función de interrupción por recepción de datos USART
{
   output_toggle(PIN_B0);
   LineaPresente=0;
   ch=getc();
   Cadena[i]="";
   Cadena[i]=ch;
   i++;
   if(i>=60)i=0;
   if(ch==0x1a)
   {
   i=0;
   LineaPresente=1;
   }
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   set_tris_b(0x04);            //portb como salida
   set_tris_a(0x20);   //porta como Entrada
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);   //activadas interrupciones
   output_Low(PIN_B1);
   output_Low(PIN_B0);
   while(1){
   delay_ms(500);
   if((LineaPresente==1)&&(Cadena[0]=='+'))output_high(PIN_B1);
   putc(Cadena[0]);
  }
 }

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #25 en: 24 de Mayo de 2016, 13:28:30 »
me parece que tenes que esperar por '\n' en vez de por 0x1A como indicador de fin de línea:

Código: C
  1. if(ch==0x1a)
  2.    {
  3.       i=0;
  4.       LineaPresente=1;
  5.    }

por esto:

Código: C
  1. if(ch=='\n')
  2.    {
  3.       i=0;
  4.       LineaPresente=1;
  5.    }

no me termina de cerrar la forma de ese if para detectar línea presente y luego ver si Cadena[0] es el símbolo +...
el tema es que cuando vos pones LineaPresente en 1 pones i en 0, entonces si en el main vos estas en el delay 500 cuando sucede esto, el proximo caracter que entre se va a grabar en Cadena[0], pisando el caracter + que habías almacenado antes.

no se si me explico bien en esta parte...

Cual sería la funcionalidad completa de tu sistema, más que nada la parte del SIM900?

Saludos
-
Leonardo Garberoglio

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #26 en: 24 de Mayo de 2016, 18:55:51 »
por el mometo es solo un codigo de prueba pero la idea es poder activaer algo con un sms y cosas como esa, me voy a fijar lo que me decis y te aviso. gracias

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #27 en: 25 de Mayo de 2016, 09:57:49 »
cambie el codigo como me propusieron pero no funciono, como harian la deteccion de la cadena de caracteres?

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #28 en: 25 de Mayo de 2016, 10:03:04 »
si ejecutas el comando AT+CMGL="ALL" que te devuelve?
« Última modificación: 25 de Mayo de 2016, 10:09:10 por elgarbe »
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:No puedo MANDAR mensajes desde modulo gprs
« Respuesta #29 en: 25 de Mayo de 2016, 10:36:16 »
Primero hay que entender como funciona la llegada de los mensajes SMS.
Para eso está el comando AT-CNMI:
AT+CNMI: New Message indication to TE

Tiene cinco parámetros y si bien no entiendo bien todos ellos, puedo decirte que con los primeros 2 configuras la accion que va a tomar el SIM cuando llegue un mensaje nuevo.
El primer parámetro dice los siguiente:
Código: C
  1. <mode>:
  2. 0: buffer in TA;
  3. 1: discard indication and reject new SMs when TE-TA link is reserved; otherwise forwarddirectly;
  4. 2: buffer new Sms when TE-TA link is reserved and flush them to TE after reservation; otherwise forward directly to the TE;
  5. 3: forward directly to TE;

Creo que TE refiere al terminal Serie del SIM900. Entonces poniendo el código 2 o 3 como primer parámetro va a hacer que al llegar un nuevo mensaje, se transmita al puerto serie (que vos estás monitoreando) tal cual como llega. En el caso del 2 hay alguna consideracion, pero no vale la pena explicarlo creo.

El segundo parámetro dice:
Código: C
  1. <mt>:
  2. 0: no SMS-DELIVER are routed to TE;
  3. 1: +CMTI: <mem>,<index> routed to TE;
  4. 2: for all SMS_DELIVERs except class 2: +CMT: .... routed to TE;
  5. class 2 is indicated as in <mt>=1;
  6. 3: Class 3: as in <mt>=2;
  7. other classes: As in <mt>=1;
No entiendo bien que es Class 2 o 3, pero poniendo el valor 2 o 3 como segundo parámetro va a hacer que se te envíe "+CMT: "SM", 1....." al puerto serie.

Entonces si o si, en la configuracion del modem ni bien lo encendes tenes que ejecutar 2 comandos:

AT + CMGF = 1
AT+CNMI=2,2,0,0,0

sin esto nada te va a funcionar como corresponde.

Luego tenes que nota que hay 2 tipos de mensajes que el SIM900 te va a dar por el puerto serie.
Un tipo es la respuesta a un comando que vos mandaste y que generalmente es OK o ERROR. Este tipo de respuesta lo vas a esperar siempre despues de enviar un comando al SIM900. De cierta forma es sincrònico con tu aplicacion, vos mandas un mensaje y enseguida esperas la respuesta.
El otro tipo de mensaje es asincrónico y puede llegar en cualqueir momento. Es la llegada de un nuevo mensaje. Esos datos que va arecivir el puerto serie van a llegar en culquier momento.

Otro tema es el fin de línea del SIM900. Al poner el terminal en la PC en modo HEX, yo veo que cuando el módulo manda OK en realidad manda OK + 13 + 10 (en decimal) que corresponedn a CR y LF o '\n' y '\r'. O sea que el final de cada línea de mensjae del SIM está determinado por esos 2 caracteres.

Bueno, ahora yo para arrancar no usaría interrupcion para el puerto serie. Porque usar interrupcion te obliga a llevar buffer's, analizarlos despues, resetearlos, etc.

Yo usaría las funciones de CCS que te permitan leer de a 1 línea completa, creo que gets es la funcion en CCS.

Entonces en las primeras lineas del codigo configuraría el SIM enviando los dos comandos que te comenté arriba y despues de cada uno de esos comandos leería una línea del puerto serie y verificaría si reciví OK o ERROR.
Por ejemplo

respuesta[100];
mensaje[100];
puts("AT + CMGF = 1\n") o printf o lo que uses para sacar datos por el puerto serie
respuesta=gets()
if(respuesta[0]=='O' && respuesta[1]== 'K')
   puts("AT+CNMI=2,2,0,0,0\n") o printf o lo que uses para sacar datos por el puerto serie
   respuesta=gets()
   if(respuesta[0]=='O' && respuesta[1]== 'K')
       respuesta=gets() // Acá el programa se va a quedar clavado esperando una línea en el puerto serie
       if(respuesta[0]=='+' && respuesta[1]== 'C'... 'M' .....  'T')
          //Reciví un mensaje, en la siguiente línea del puerto serie viene el mensaje
          mensaje=gets();
          if(mensaje[0]=='#' && respuesta[1]== 'A'... '0')
             // si el mensaje enviado es #A0 apago la salida A0
          ............
         ............
else
   error

bueno, esa es la idea... hay que pasarla a código CCS... si lo vas haciendo y probando avisanos y lo revisamos.

Saludos
-
Leonardo Garberoglio


 

anything