Autor Tema: No puedo reconocer la cadena en trama gsm  (Leído 3566 veces)

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

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
No puedo reconocer la cadena en trama gsm
« en: 09 de Mayo de 2016, 21:14:28 »
hola estoy trabajando con el sis 900 y quiero detectar cuando la cadena que tira es "OK" pero no puedo, este es el codigo:
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
#use delay(int=4000000,RESTART_WDT)
#use rs232(uart1, baud=9600)//usart1 -->ajuste de XMIT y RCV para la USART 1
int i=0;
char Cadena[60]="";
char CadenaAux[60]="";
char ch;
int1 DatoPresente=0;
#int_rda
void rd_isr(void)//función de interrupción por recepción de datos USART
{
   ch=getc();
   Cadena[i]=ch;
   CadenaAux[i]=ch;
   i++;
if (ch==0x0d)DatoPresente=1;///si manda el enter termina el comando
}
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(0x00);   //porta como Entrada
   enable_interrupts(int_rda);
   enable_interrupts(GLOBAL);   //activadas interrupciones
   output_Low(PIN_B0);
   while(1){
   if(DatoPresente==1)
     {
         for (i=0;i<=60;++i)
         {
         ch=Cadena[i];
         putc(ch);
         Cadena[i]="";
         }
     i=0;
     DatoPresente=0;
     }
   if((CadenaAux=="OK"+0x1A+0x0d))output_high(PIN_B0);
   }         
}
Mas adelante tengo que reconocer otras cosas pero esta es la mas facil, me ayudan?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No puedo reconocer la cadena en trama gsm
« Respuesta #1 en: 09 de Mayo de 2016, 21:25:55 »
Solo decir que ademas no hay ningun limitante de i en la intrrupcion y tampoco podes comparar de esta forma:

Código: C
  1. (CadenaAux=="OK"+0x1A+0x0d)

Un string lo tenes que comparar letra a letra, es decir primero la O, luego la K, luego el 0x1A, etc etc.

Tu mayor problema es que no conoces siquiera como funciona un array ni un puntero, por que CadenaAux asi solo es el puntero a la direccion que ocupa el primer elemento de ese array.

Tal ves lo que buscas sea un memcmp() ,
« Última modificación: 10 de Mayo de 2016, 08:30:03 por KILLERJC »

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo reconocer la cadena en trama gsm
« Respuesta #2 en: 10 de Mayo de 2016, 06:39:51 »
NO entiendo, cual es el error entonces porque si hago esto:
Código: [Seleccionar]
if((CadenaAux[0]=='O')&&(CadenaAux[1]=='K')&&(CadenaAux[2]=0x1A)&&(CadenaAux[3]=0x00D))output_high(PIN_B0);else output_loW(PIN_B0); funciona

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:No puedo reconocer la cadena en trama gsm
« Respuesta #3 en: 10 de Mayo de 2016, 08:13:59 »
El error esel que te dice KILLER, no puedes comparar una cadena "OK" contra la direccion de memoria de CadenaAux.
Cuando pones CadenaAux en el código se traduce a "la direccion de memoria donde se almacena el primer elemento del array CadenaAux"
Tienes dos opciones, como lo pusiste en el post anterior, comparando caracter por caracter o usando las librerías string.h, que en definitiva hacen mas o menos lo mismo pero con punteros.

saludos
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No puedo reconocer la cadena en trama gsm
« Respuesta #4 en: 10 de Mayo de 2016, 08:27:11 »
Exactamente como dice elgarbe.

En tu ultimo codigo estas comparando lo que contiene cadenaAux, al hacer CadenaAux[0],

Suponete que CadenaAux es de 5 lugares y el linker la ubica en 0x100 ( memoria lineal voy a suponer ) entonces

CadenaAux[0] = 'a';    // Ubicada en 0x100
CadenaAux[1] = 'b';    // Ubicada en 0x101
CadenaAux[2] = 'c';    // Ubicada en 0x102
CadenaAux[3] = 'd';    // Ubicada en 0x103
CadenaAux[4] = 'e';    // Ubicada en 0x104

Si vos haces CadenaAux, eso devuelve 0x100, no devuelve el "contenido" (es decir la 'a' o todo el string). Es lo mismo que hacer &CadenaAux[0].

Si hago

*CadenaAux, esto me va a devolver 'a', podrias pensarlo como *(0x100) es decir el contenido dentro de 0x100.

strcmp y memcmp. hacen casi lo mismo, nomas que el strcmp espera un caracter nulo para finalizar la comparacion en caso que sean todos iguales. Por dentro lo que hacen es tomar es trabajar con punteros. Es decir, Comparar CadenaAux con "Hola"

memcmp(CadenaAux,"Hola",4);

"Hola" es como un array que recide en la flash, tiene una direccion de comienzo como si fuera un array. Por dentro esa funcion copia los punteros, es decir crea un puntero nuevo de CadenaAux, y uno de "Hola", y comienza a comparar letra por letra, hasta que llega a 4, si comparo todas y estuvo bien, entonces creo que da 0, deberias buscarlo por internet las respuesta que da el memcmp.
« Última modificación: 10 de Mayo de 2016, 08:31:19 por KILLERJC »

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo reconocer la cadena en trama gsm
« Respuesta #5 en: 10 de Mayo de 2016, 11:32:14 »
Gracias por explicarme, Las comparaciones las voy a hacer letra por letra para no  complicarme, espero que salga bien

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo reconocer la cadena en trama gsm
« Respuesta #6 en: 10 de Mayo de 2016, 18:52:08 »
Siguiendo con el tema quiero reconocer cuando recibo un mensaje de texto y poder leerlo, al recibir el sms el modulo tira:
+CMTI: "SM",16 donde el 16 es el indice del mensaje en la memoria
tengo que extraer ese numero y responder con: AT+CMGR=16 para que me tire el sms en texto
 este es la funcion pero no me imprime el mensaje:
Código: [Seleccionar]
void LeerSMS()
{
output_high(PIN_B1);
Comando="AT+CMGR="+CadenaAux[12]+CadenaAux[13]+CadenaAux[14];
printf(Comando);
CadenaAux[0]=' ';///para que no repita el bucle
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:No puedo reconocer la cadena en trama gsm
« Respuesta #7 en: 10 de Mayo de 2016, 19:18:22 »
Veo 3 problema con tu logica.

- ¿ Que tan seguro estas que el numero esta en CadenaAux[12], 13 y 14 ?
- Ahi son 3 letras, podes estar enviando cualquier cosa
- Faltan los \r\n

Tambien en tu primer codigo no tiene limitante el contador del array, asi que OJO con eso. Lo repito por que ya lo habia escrito antes.

Otra cosa mas los modulos tienen una memoria limitada, pueden mantener una cierta cantidad de mensajes , asi que creo que para no complicar la vida de nadie ( y menos uno mismo ), podrias ir leyendo/procesando y borrando siempre el primero. Eso hace que siempre tengas que leer unicamente el primero y los comandos sean siempre los mismos, no contengan "variables" dentro de estos.
Código: [Seleccionar]
AT+CMGL=1\r\n
Respuesta:
Código: [Seleccionar]
+CMGR: "REC READ","1234567890",,"12/07/30,00:12:05+32"
Mensaje_aca creo

OK
La ventaja de este metodo es que:

- Siempre vas a leer el primero, por lo cual el comando es siempre "AT+CMGR=1\r\n" para poder leerlo
- Vas a usar otro comando que es para borrar el primer mensaje, lo cual siempre va a ser igual ( no va a cambiar ), no recuerdo cual es el comando.
- Nunca deberias lidiar con una bandeja llena. Con lo cual recibis otro codigo diciendote que esta lleno pero que hay mensajes en espera. Sino tenes que agregar soporte a tu programa para ese codigo.

La desventaja:

- Es que no se guardan los mensajes, a no ser que lo hagas externo al PIC, supongamos que los guardes en una SD, por necesidad.

La otra es usar:

Código: [Seleccionar]
AT+CMGL="REC UNREAD"
Que si no me equivoco te devuelve todos los mensajes "no leidos".

Código: [Seleccionar]
+CMGL: 1,"REC READ","+85291234567",,"07/02/18,00:05:10+32"
Reading text messages is easy.
+CMGL: 2,"REC READ","+85291234567",,"07/02/18,00:07:22+32"
A simple demo of SMS text messaging.
+CMGL: 3,"REC READ","+85291234567",,"07/02/18,00:12:05+32"
Hello, welcome to our SMS tutorial.

OK

Observaras que el formato es otro el de respuesta. y te puede incluir muchos mensajes en 1 sola respuesta. Pero ahi directamente los pasa a todos como "leidos" asi que es 1 para todos los mensajes "no leidos".

Ventajas:

- Lees todos los "no leidos", si llegaron 2 de golpe, los tenes a los 2.
- Usas un comando fijo para leerlos, no necesitas saber el numero
- No estas recibiendo y borrando ahi nomas.

Desventajas:

- Tenes que lidiar con una posible bandeja llena, la cual vas a tener que borrar mensajes. Para que lleguen los nuevos. Eso implica tener la posibilidad de recibir otro "comando" desde el GSM.
- Se complica un poco mas el parseo de la respuesta, no es demasiado en realidad. Pero se complica. Y si queres hacer un "paso a paso" convendria mas el anterior.


Ese es mi punto de vista. Seguro que otro tendra alguno distinto, y va a depender mucho de la aplicacion que le quieras dar.
« Última modificación: 10 de Mayo de 2016, 19:20:30 por KILLERJC »

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:No puedo reconocer la cadena en trama gsm
« Respuesta #8 en: 10 de Mayo de 2016, 20:49:45 »
Gracias por responder, dejame que lo analice y te respondo