Autor Tema: Problema con punteros y strings para lectura de gsm.  (Leído 2329 veces)

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

Desconectado paco1980

  • PIC16
  • ***
  • Mensajes: 129
Problema con punteros y strings para lectura de gsm.
« en: 21 de Febrero de 2008, 06:07:26 »
Hola chic@s, despues de rebanarme los sesos, no doy con la solucion a mi problema. Estoy haciendo un programa para gestionar los mensajes que me llegan de un modem. Os voy a explicar lo que hace el programa, y mi problema.
El modem está configurado para que si le llega un mensaje, me envíe una trama con el númeo donde se guardó ese mensaje. (intro)(inicio de linea)+cmti: "mt",5(intro)(inicio de linea)., por lo tanto, yo al recibir la trama entre los dos intros la proceso, recojo la posición donde esta guardado el mensaje, y le envio al modem el comando (intro)AT+CMGR=5(INTRO) donde le estoy pidiendo que me muestre el mensaje que le ha llegado. El mensaje que recibo está contenido entre cuatro intros, (intro)+CMGR: "REC UNREAD","+345675656",,"fechas y horas" (intro) paco (intro) ok(intro) , por lo tanto, le digo al programa que no procese la trama hasta que haya recibido los cuatro intros. Al procesar la trama, yo debo verificar que el mensaje contiene la palabra "paco", y entonces recoger el número de teléfono para luego enviar el mensaje al remitente (esta parte aun no esta hecha).
Bien, pues mi problema, es que la primera ver que hago el proceso total, lo hace perfecto, pero a partir de aqui, ya no logro hacerlo funcionar(estoy hablando de la segunda parte "RESPUESTA AL LEER MENSAJE".
Lo que he podido comprobar es que cuando imprimo el valor del buffer total despues de los cuatro intros, no me aparece la cadena que me debería aparecer.
Espero me podais hechar una mano, porque no tengo mucha idea de como manejar punteros y puede ser que hay la este cagando.

Muchas gracias de antemano y un cordial saludo.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Problema con punteros y strings para lectura de gsm.
« Respuesta #1 en: 22 de Febrero de 2008, 12:33:27 »
buenas paco!
mira, yo no se mucho de CCS, pero he trabajado mucho con C y me imagino q en este caso no sera muy diferente, vamos a ver si te puedo dar una mano.
Pero primero, podrias documentar un poco mejor el codigo asi me oriento mejor en q es lo q vas haciendo, y si no es mucha molestia, podrias marcar bien donde esta el problema asi me concentro en eso?
gracias!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado paco1980

  • PIC16
  • ***
  • Mensajes: 129
Re: Problema con punteros y strings para lectura de gsm.
« Respuesta #2 en: 22 de Febrero de 2008, 16:57:10 »
De antemano, gracias por intentar ayudarme.
En el archivo te lo he documentado todo, espero que lo puedas ver todo claro, si tienes alguna pega, me lo dices y lo comentamos.
A ver si podemos encontrar la errata porque a mi me saca de quicio ya.
Un saludo

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problema con punteros y strings para lectura de gsm.
« Respuesta #3 en: 22 de Febrero de 2008, 18:02:23 »
He estado revisando el código y no veo la posible causa del error.

De todos modos publico el código de forma un poco mas visible, poniéndole la identación, por si algún amigo desea ayudarnos.

Código: C#
  1. #include <18f4431.h>
  2. #include <string.h>
  3. #fuses intrc,nomclr,t1lowpower,noprotect,noput,nowdt,nobrownout,nolvp
  4. #use delay (clock=4Mhz)
  5. #use rs232 (baud=9600,xmit=pin_c6,rcv=pin_c7,parity=n,bits=8)
  6.  
  7. int const lenbuff=100;
  8. int pregunta=0;
  9. int xbuff=0x00,flagcommand=0,final=0,a=0,v=0;
  10. char cbuff[lenbuff];
  11. char rcvchar=0x00;
  12. char pos_sms=0x00;
  13. char telefono[10];
  14. void inicbuff(void);
  15. void procesa_comando(void);
  16.  
  17.  
  18. #int_rda
  19. void comunica(){
  20.  
  21.    rcvchar=0x00;
  22.    if (kbhit()){
  23.       rcvchar=getc(); // recojo dato que me llega del puerto serie.
  24.       if(rcvchar!=0x0a){  //si es el caracter de inicio de linea, no lo acumulo en la cadena cbuff.
  25.          if (xbuff<100){
  26.             cbuff[xbuff++]=rcvchar; //introduzco el caracter recibidi del rs-232 en una nueva posicion de la cadena.
  27.             printf("introduce en cbuff=%s\n\r",cbuff); //esto es para ir viendo yo si se introducia bien.
  28.          }
  29.       }
  30.       if(rcvchar==0x0d){ //si recibo un intro, hago lo siguiente.
  31.          final++; //incremento la variable final
  32.          if(pregunta){  //si la variable pregunta está a "1", necesito recoger cuatro (intros) para irme a procesar la trama.
  33.             printf("pregunta=1");
  34.             if(final==4){
  35.                flagcommand=1;
  36.                final=0;
  37.                pregunta=0;
  38.             }
  39.          }
  40.          else{
  41.             printf("pregunta=0"); //si pregunta está a cero, solo necesito recoger 2 (intros ) para procesar la trama.
  42.             if(final==2){
  43.                flagcommand=1; //Nota: todo esto es porque si al modem yo no le pregunto nada, solo me puede enviar una trama cuando se le manda un mensaje
  44.                final=0;            //por movila que es +cmti: "mt",X donde X me da la posicion en el cual se ha guardado el mensaje recibido en el gsm. Pues bien, esta trama
  45.             }
  46.          }                  //que el modem me envia está siempre contenida entre dos intros.
  47.       }                    //Cuando yo la recibo, lo que hago es recoger la posición donde se ha guardado el sms, y preguntarle al modem para que me lo envíe.
  48.    }                    //la trama que el modem me envía esta vez, está contenida entre cuatro intros, y por lo tanto, cuando yo pregunto al modem por el sms
  49. }                       //mediante at+cmgr=X  pongo a uno la variable pregunta para no procesar la trama hasta que haya recibido los cuatro intros.
  50.  
  51. void main (){
  52.  
  53.    inicbuff();            //incio la cadena que va ha guardar la trama
  54.    for (a=0;a<10;a++){
  55.       telefono[a]='\0';
  56.    }
  57.  
  58.    enable_interrupts(int_rda);
  59.    enable_interrupts(global);
  60.    delay_ms(5000);
  61.    printf("inicia");
  62.    do{
  63.    
  64.       if(flagcommand){
  65.          flagcommand=0;
  66.          disable_interrupts(int_rda);
  67.          procesa_comando();
  68.          inicbuff();
  69.          printf("cbuff del while=%s\n\r",cbuff);
  70.          enable_interrupts(int_rda);
  71.       }
  72.    }while(true);
  73. }
  74.  
  75. void inicbuff(void)
  76. {
  77.    int i;
  78.    for(i=0;i<lenbuff;i++){
  79.       cbuff[i]='\0';
  80.    }
  81.    xbuff=0x00;
  82. }
  83.  
  84. void procesa_comando(void){
  85.    char *retorno1;
  86.    char *retorno2;
  87.    char *coma;
  88.    char *clave;
  89.    char *numero;
  90.    char string1[10];
  91.    char string2[10];
  92.    char string3[10];
  93.    char s1[10];
  94.    char s2[10];
  95.    char s3[10];
  96.    int i=0;
  97.    for (i=0;i<10;i++){  //pongo los strings a cero
  98.       s1[i]='\0';
  99.       s2[i]='\0';
  100.       s3[i]='\0';
  101.       numero[i]='\0';
  102.       string1[i]='\0';
  103.       string2[i]='\0';
  104.       string3[i]='\0';
  105.    }
  106.  
  107.  
  108. //NUEVO MENSAJE RECIBIDO.........................
  109.  
  110.    strcpy(string1,"+CMTI:");   //copio en la cadena STRING1 "+cmti:"
  111.    retorno1=strchr(cbuff,0x0d); //posiciono el puntero retorno1 al primer intro recibido
  112.    retorno1++;                       //lo incremento una posición.
  113.    strncpy(s1,retorno1,6);        //introduzco en la cadena S1 seis caracteres de la cadena cbuff a partir de la posición que me marca el puntero
  114.    if (!stricmp(s1,string1)){       //comparo que S1 y String1 sean igual "+cmti:"
  115.       coma=strchr(cbuff,0x2c);     //pongo el puntero en la posición de la coma de cbuff
  116.       coma+=1;                          //lo incremento para que me apunte al numero donde está guardado el mensaje del modem
  117.       pos_sms=*coma;                 //copio el numero al que apunta en el char pos-sms
  118.       printf("AT+CMGR=%c\r",pos_sms); //le pregunto para que me envíe el mensaje(el de los cuatro intros).
  119.       pregunta=1;                        //pongo el chivato a "1" para saber que tengo que recibir 4 intros para procesar la trama.
  120.       goto fin;
  121.    }
  122.    // RESPUESTA AL LEER MENSAJE......................
  123.  
  124.    strcpy(string2,"+CMGR:");     //Aqui empezamos el procesamiento de la segunda trama.
  125.    printf("valor de string2=%s\n\r",string2); //en definitiva es lo mismo que en la trama anterior, solo que aparte de hacer la comprobación de "+cmgr" desde
  126.    retorno2=strchr(cbuff,0x0d);                 //el primer intro, también busco que el mensaje contenga la palabra "paco" desde la primera P.
  127.    printf("valor de buff1=%s\n\r",cbuff);      //una vez hechas estas comprobaciones, recojo el numero de telefono del remitente que va contenido en el sms
  128.    retorno2++;                                       //el cual se que está 5 posiciones despues de la primera ","=0x2c.
  129.    strncpy(s2,retorno2,6);
  130.    printf("valor de s2=%s\n\r",s2);            
  131.    if (!stricmp(s2,string2)){
  132.       strcpy(string3,"paco");
  133.       printf("valor de string3=%s\n\r",string3);
  134.       clave=strchr(cbuff,0x70);
  135.       printf("valor de cbuff2=%s\n\r",cbuff);
  136.       strncpy(s3,clave,4);
  137.       printf("valor de s3=%s\n\r",s3);
  138.       if(!stricmp(s3,string3)){
  139.          numero=strchr(cbuff,0x2c);
  140.          numero=numero+5;
  141.          strncpy(telefono,numero,9);
  142.          printf("valor de telefono=%s\n\r",telefono);
  143.          printf ("el telefono es %s",telefono); //
  144.       }
  145.    }
  146. fin:
  147.    v=0;
  148. }
  149.  
  150. // Pues el proble es que la primera trama siempre me la analiza bien, pero la segunda solo me la aniza bien la primera vez, o sea, cuando reinicio el pic.
  151. // He observado al concluir los intros y empezar a procesar la trama, que la segunda vez que proceso la trama de cuatro intros, antes de hacer nada leo la cadena cbuff y no esta la trama completa. Ejemplo:
  152. // cbuff bueno=[(intro)+cmgr: "red unread","+34676767789",,"23/10/2007etc...."/(into)paco(intro)ok(intro)]
  153. // cbuff malo =[(intro)+cmgr: "rec unread","+34] por lo tanto faltan muchos caracteres.
  154. // Pues eso es lo que me hace a partir de la segunda vez que hago el proceso completo, y lo gracioso es que yo voy leyendo la cadena cbuff y tengo todos los caracteres, y es cuando entro en VOID PROCESA COMANDO cuando desaparecen todos los caracteres.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado paco1980

  • PIC16
  • ***
  • Mensajes: 129
Re: Problema con punteros y strings para lectura de gsm.
« Respuesta #4 en: 23 de Febrero de 2008, 16:13:14 »
Gracias REDPIC, asi queda mas claro, ya que yo soy poko ordenado,ja,ja..
En fin, si tuvierais la posibilidad de probarlo, aunque sea en un pic16ff877 mismo, veriais en el hiperterminal el problema que os comento.
/////////////////////////////////////////////////////////////////////////////////////
//Envio:(intro)                                                           //
//Envio: +cmti: "mt",4                                                //
//Envio: (intro)                                                        //
// Recibo:at+cmgr=4                                            //
// Recibo: (intro)                                                  // 
// Envio: (intro)                                                       //
// Envio: +cmgr: "rec unread", "+34620909900"         //
// Envio: (intro)                                                       //
// Envio: Paco                                                         //
// Envio: (intro)                                                      //
// Envio: ok                                                           //
// Envio: (intro)                                                     //
// Recibo: el telefono es 620909900                    //
///////////////////////////////////////////////////////////////////////////////////
NOTA:Este es el proceso que tiene que hacer, pero una vez hecho, si repetimos el proceso ya no me localiza el numero de telefono.
NOTA2:´todos los demás PRINTF son solo para poder ver que esta pasando ya que no se como poder simular el programa.

Un saludo a todos.

Desconectado paco1980

  • PIC16
  • ***
  • Mensajes: 129
Re: Problema con punteros y strings para lectura de gsm.
« Respuesta #5 en: 23 de Febrero de 2008, 22:13:06 »
Bueno chicos, despues de echarle valor y simular el programa (con algunas modificaciones) en mplab, he descubierto el problema y me ha dejado MUERTO.
Resulta que en el siguiente código:

 for (i=0;i<10;i++)
   {     
      s1='\0';     
      s2='\0';     
      s3='\0';     
      numero='\0';     
      string1='\0';     
      string2='\0';     
      string3='\0';   
  }
al poner a cero las diez posiciones de memoria de string1, también me pone a cero diez posiciones de la cadena cbuff, y no se porque?
Lo que he hecho es poner a cero las cadenas, pero antes de recibir la trama en cbuff, de tal manera que no se borre lo recibido.

Aunque de esa manera se solucione, me deja preocupado el tema.
¿Teneis alguna idea de porqué será que me actua de esa manera?
Un saludo a todos

Desconectado paco1980

  • PIC16
  • ***
  • Mensajes: 129
Re: Problema con punteros y strings para lectura de gsm.
« Respuesta #6 en: 23 de Febrero de 2008, 22:32:13 »
Madre mia que tonto. Lo siento chicos, la culpa era mia, ya he encontrado la errata.
for (i=0;i<10;i++)
  {
    s1='\0';     
    s2='\0';     
    s3='\0';     
    numero='\0';     
    string1='\0';     
    string2='\0';     
    string3='\0';   
  }
se me coló numero. Despues de ejecutar todo el programa, numero, el cual es un puntero, se queda apuntando a una posición de cbuff, y entonces, al insertarlo por equivocación en este bucle, lo que hace es poner a cero diez posiciones de la cadena cbuff a partir del lugar de donde apuntaba.

¡ YA PODEMOS CONTINUAR !
espero hacer algo bonito y poder dejaroslo en el foro, ya que por separado hat mucha información para manejar un modem, pero no he visto ningún programa entero que gestiones mensages con lectura, borrado y envío.

Un saludo y gracias.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Problema con punteros y strings para lectura de gsm.
« Respuesta #7 en: 24 de Febrero de 2008, 00:27:32 »
llegue algo tarde para ayudar, pero me alegro q hayas descubierto el problema ;)
los errores "tontos" son los mas dificiles de descubrir jeje. Suerte con eso!!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein