Autor Tema: Error al comparar dos strings con strcmp  (Leído 42587 veces)

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

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #75 en: 18 de Enero de 2011, 20:15:44 »
Sigue sin salir de la funcion...
He probado esto ( sabiendo que se reciben 7 caracteres)
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;

do
{   
   
   CaracterLeido = getch();
   
   if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
   {
      LED1=1;
      *palabra = CaracterLeido;
      *palabra++;
   }
   //*palabra = '\0';
   indice++;
   //LED2=1;
}
   //while (CaracterLeido != '\n'); //\n
   while(indice<7);
   LED2=1;
}


Y se queda dentro del bucle siempre...

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #76 en: 18 de Enero de 2011, 20:25:14 »
He añadido una variable "cont" para saber el numero de veces que entraba dentro del if y he comprobado que eran dos, por lo que eso esta bien. El error es que no sale del bucle creo.. seguire probando..

En cambio.. cuando hago una prueba para ver cuantos caracteres son \r o \n de esta forma:
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;

do
{   
   
   CaracterLeido = getch();
   
   if((CaracterLeido =='\r')||(CaracterLeido=='\n'))
   cont++;

   if (cont==0)
   LED1=1;
    else
    LED2=1;

   if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
   {
      
      *palabra = CaracterLeido;
      *palabra++;
      
   }
   //*palabra = '\0';
   indice++;
   
   time_delay(999999999999999);


}
   //while (CaracterLeido != '\n'); //\n
   while(indice<7);
   //LED2=1;
}

Me sale que es con cont==0, osea.. que nunca entra..
« Última modificación: 18 de Enero de 2011, 20:33:26 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #77 en: 18 de Enero de 2011, 20:44:10 »
Segun otra prueba solo se reciben 2 caracteres diferentes a "O" o a "K". Es como si hiciera bien el \n\fOK y a partir de aqui ya no viera mas datos.
Voy colgando el codigo de las pruebas que hago:
Código: [Seleccionar]
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;

do
{

CaracterLeido = getch();

if((CaracterLeido !='O')&&(CaracterLeido!='K'))
cont++;


if(cont==1)
LED1=1;

if (cont==2)
LED2=1; 
   
if(cont==3)
LED3=1;

if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
{

*palabra = CaracterLeido;
*palabra++;

}
//*palabra = '\0';
indice++;

time_delay(999999999999999);


}
//while (CaracterLeido != '\n'); //\n
while(indice<7);
//LED2=1;
}


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #78 en: 18 de Enero de 2011, 22:56:13 »
  Podés subir el archivo a algún servidor de almacenamiento y pasarme el link. Puede ser Megaupload, Rapidshare. 4shared.... hay varios sitios

  Qué extraños está todo, no siempre responde de la misma manera... te devuelve el comando que mandaste.... está bastante complejo el asunto.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #79 en: 19 de Enero de 2011, 06:32:21 »
No devuelve el comando que mande, lo devuelve bien!
fijate:

Read data:
00000000: 41 54 0d 0d 0a 4f 4b 0d  |  0a 0a 41 54 53 30 3d 31  AT...OK...ATS0=1
00000010: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 31 32 3d 34  ...OK...ATS512=4
00000020: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 30 32 3d 31  ...OK...ATS502=1
00000030: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 33 36 3d 31  ...OK...ATS536=1
00000040: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 2b 42 54 4b 3d 22  ...OK...AT+BTK="
00000050: 31 32 33 34 22 0d 0d 0a  |  4f 4b 0d 0a 0a 41 54 26  1234"...OK...AT&
00000060: 57 0d 0d 0a 4f 4b 0d 0a  |  0a 41 54 5a 0d 0d 0a 4f  W...OK...ATZ...O
00000070: 4b 0d 0a       

Esta sequencia marcada en negrita es el "OK" con el retorno de carro etc.. y como ves se va repitiendo. Esta claro que la contestacion del modulo es lo que hay en negrita.

Si te fijas tambien todos los comndos empiezan por AT, por lo que tambien se ve ahi. Fijate que AT es 41 54 y tambien se va repitiendo en todos.
Eso esta bien. Lo hay que hacer es que acabe de leer la funcion cuando se encuentre a dos 0a 0a

Te dejo el link de donde estan colgados los docs: http://www.filefactory.com/file/b51043c/n/Documentos.zip
En el documento "blue2i Quick Start Guide" en la pagina 8 esta el ejemplo de comandos AT que utilizo.
En el documento "AT command Set" en la pag 5 esta la explicacion de lo que envia el modulo y lo que recibe.


Muchas gracias
« Última modificación: 19 de Enero de 2011, 07:26:59 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #80 en: 19 de Enero de 2011, 08:04:22 »
No entiendo muchas cosas...
Cuando hago las diferentes llamandas a la funcion getch con:
Código: [Seleccionar]

LED0=0;
LED1=0;
LED2=0;
LED3=0;
buffer1[0]=getch();
LED0=1;
buffer1[1]=getch();
LED1=1;
buffer1[2]=getch();
LED2=1;
buffer1[3]=getch();
LED3=1;
buffer1[4]=getch();
LED0=0;
buffer1[5]=getch();
LED1=0;
buffer1[6]=getch();
LED2=0;

Se me encienden los dos primeros leds, con lo que pienso que hay 2 caracteres.

En cambio ayer me puse dentro de la funcion leer_palabra que va llamando a getch y vi que entraba dos veces en el if ( una para la "O" y otra para la "K") y que tambien no entraba mas de una vez por lo que SI que hay mas de 2 caracteres...

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #81 en: 19 de Enero de 2011, 10:21:57 »
No devuelve el comando que mande, lo devuelve bien!
fijate:

Read data:
00000000: 41 54 0d 0d 0a 4f 4b 0d  |  0a 0a 41 54 53 30 3d 31  AT...OK...ATS0=1
00000010: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 31 32 3d 34  ...OK...ATS512=4
00000020: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 30 32 3d 31  ...OK...ATS502=1
00000030: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 53 35 33 36 3d 31  ...OK...ATS536=1
00000040: 0d 0d 0a 4f 4b 0d 0a 0a  |  41 54 2b 42 54 4b 3d 22  ...OK...AT+BTK="
00000050: 31 32 33 34 22 0d 0d 0a  |  4f 4b 0d 0a 0a 41 54 26  1234"...OK...AT&
00000060: 57 0d 0d 0a 4f 4b 0d 0a  |  0a 41 54 5a 0d 0d 0a 4f  W...OK...ATZ...O
00000070: 4b 0d 0a       

Esta sequencia marcada en negrita es el "OK" con el retorno de carro etc.. y como ves se va repitiendo. Esta claro que la contestacion del modulo es lo que hay en negrita.

Si te fijas tambien todos los comndos empiezan por AT, por lo que tambien se ve ahi. Fijate que AT es 41 54 y tambien se va repitiendo en todos.
Eso esta bien. Lo hay que hacer es que acabe de leer la funcion cuando se encuentre a dos 0a 0a

Te dejo el link de donde estan colgados los docs: http://www.filefactory.com/file/b51043c/n/Documentos.zip
En el documento "blue2i Quick Start Guide" en la pagina 8 esta el ejemplo de comandos AT que utilizo.
En el documento "AT command Set" en la pag 5 esta la explicacion de lo que envia el modulo y lo que recibe.


Muchas gracias

  ¿Entonces toda esa información es como un log de lo que pasa en la terminal que estás usando. Tanto lo que vos mandás como lo que te envía el dispositivo?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #82 en: 19 de Enero de 2011, 10:27:55 »
Si. Ahora mismo esos comandos AT los envio por el hyperterminal ( y claro, el modulo Bluetooth responde con los OK).
Ahi esta la representacion de lo que pasa en realidad y lo q tiene q pasar en el PIC.
« Última modificación: 19 de Enero de 2011, 10:32:23 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #83 en: 19 de Enero de 2011, 10:33:07 »
Ahora mismo estoy trabajando con la funcion de la siguiente forma:
Código: [Seleccionar]
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;
int cont1=0;

do
{
LED1=1;
CaracterLeido = getch();
LED2=1;
if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
{

*palabra = CaracterLeido;
*palabra++;
}

if(CaracterLeido == '\r'){
//*palabra = '\0';
*palabra++;

}

if(CaracterLeido=='\n'){
//*palabra='\0';
*palabra++;
cont++;

}

if(indice==1)
LED3=1;


indice++;
time_delay(999999999999);


}
//while (CaracterLeido != '\n'); //\n
while(cont!=2);


}

Me sale indice=1 con lo que el bucle solo lo hace 1 vez..

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #84 en: 19 de Enero de 2011, 11:06:53 »
  No será todo un problema de velocidades. ¿A cuánto tenés configurado el terminal y a cuanto el PIC?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #85 en: 19 de Enero de 2011, 11:10:46 »
Los dos a 9600. Ya hice una prueba de connexion modulo Bluetooth con el terminal. Es mas lo que antes te he mostrado esta hecho a 9600.

La funcion getch.. como sabe que ya ha leido un caracter y tiene que ir al siguiente?
La tengo asi:

Código: [Seleccionar]
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;


do
{
CaracterLeido = getch();

if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
{
*palabra = CaracterLeido;
*palabra++;
}

if(CaracterLeido == '\r'){
//*palabra = '\0';
*palabra++;

}

if(CaracterLeido=='\n'){
//*palabra='\0';
*palabra++;
cont++;
}

}
//while (CaracterLeido != '\n'); //\n
while(cont!=2);

}
« Última modificación: 19 de Enero de 2011, 11:15:18 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #86 en: 19 de Enero de 2011, 11:22:15 »
A ver es que seguro que es una tonteria.. hay que tener en cuenta que: 0d es \r y 0a es \n
Hay que leer 7 caracteres : 0d 0a 4f 4b 0d 0a 0a
 
Primero de todo entra y no entra en el if porque es \r. En este caso hay q saber si dejar ese sitio como \0(nulo) o no. En el siguiente caso pasa lo mismo para \n. Con O y K entra en el if y despues vuelve a no entrar para \r \n \n.

Al final hay un cont que detecta dos \n..

Yo lo que no veo muy claro es la actualizacion del caracter. Una vez haya hecho la "O" por ejemplo, como va a la "K"?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #87 en: 19 de Enero de 2011, 11:41:54 »
A ver es que seguro que es una tonteria.. hay que tener en cuenta que: 0d es \r y 0a es \n
Hay que leer 7 caracteres : 0d 0a 4f 4b 0d 0a 0a
 
Primero de todo entra y no entra en el if porque es \r. En este caso hay q saber si dejar ese sitio como \0(nulo) o no. En el siguiente caso pasa lo mismo para \n. Con O y K entra en el if y despues vuelve a no entrar para \r \n \n.

Al final hay un cont que detecta dos \n..

Yo lo que no veo muy claro es la actualizacion del caracter. Una vez haya hecho la "O" por ejemplo, como va a la "K"?

  A ver.... la función getch() sí o sí lee un caracter. Tené en cuenta que en la implementación de dicha función hay un while a la espera que se setee RCIF (que justamente se setea cuando se llena el el registro RCREG que es donde se almacena el caracter que le llega via RS232). Entonces sólo salgo de dicha función cuando haya leído un caracter del RS232

  En la implementación que yo te había subido de "leer_palabra" sólo se iban almacenando en la variable los datos de entrada si no eran ni '\r' ni '\n'.

  Como va a cada caracter es sencillo. Supongamos que yo te voy dando -en la mano- pelotitas de distintos colores. A vos te interesan las rojas (que sería lo que hacemos con los if) el resto las dejas en el suelo y sólo las rojas las guardas en un vaso.

  Es así como se maneja la función con los caracteres.
  Si yo mando un '\r' o un '\n' no hago nada, pero si mando otro tipo de caracter lo voy almacenando en una variable en el mismo orden que me van llegando. Así, si el dispositivo manda \r \n O K \r \n, las \r y las \n las dejo pasar y almaceno OK en la variable.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #88 en: 19 de Enero de 2011, 11:45:21 »
Hay una pequeña contradiccion si me permites decirlo asi.
En lo que antes he mostrado, he pensado que la respuesta es 0d0a4f4b0d0a0a

Este ultimo en negrita segun el manual no tiene que estar... seguro que ese caracter se añade pero no forma parte del OK digamos.

Ayuda por favor.. ya no se por donde ir..
Que harias?

P.D: Acabo de ver tu mensaje y si que tienes razon pero ahora mismo no se que hacer y ya se me pasa por la cabeza todo.

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #89 en: 19 de Enero de 2011, 11:57:13 »
void leer_respuesta(char * palabra)
{
char indice = 0;
char CaracterLeido;
int cont=0;


while(indice<6)
{   
   CaracterLeido = getch();



   if ((CaracterLeido != '\r') && (CaracterLeido != '\n'))
   {
      *palabra = CaracterLeido;
      *palabra++;
   }
   indice++;
   if (indice==6)
   {
      *palabra='\0';
   }
}
LED3=1;   
}

El problema claramente esta en la funcion. Ese led3 no se enciende.. es un while infinito porque dentro si que se entra.. pero PORQUE?
Estoy ya desesperado...