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

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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #60 en: 18 de Enero de 2011, 09:59:44 »
Ahora mismo no me entra en la funcion leer_palabra.. lo tengo declarado en 6..
Es posible que falle algo de la funcion o sera el buffer..?

  ¿Pero no entra a la función o no sale de ella?
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 #61 en: 18 de Enero de 2011, 10:00:58 »
Como puedo testear eso?

Edito: No sale de ella, ya lo he probado.
Puedes explicarme estas dos lineas:

*palabra= CaracterLeido;
*palabra++;

Muchas gracias de nuevo.
« Última modificación: 18 de Enero de 2011, 10:04:49 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #62 en: 18 de Enero de 2011, 10:24:44 »
La funcion funciona para buffer[2] e indice 2.
Eso quiere decir que recibo dos caracteres pero que no son "O" "K"

A lo mejor estoy recibiendo el retorno de carro y el linefeed.. antes d recibir el OK.
Que puede ser?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #63 en: 18 de Enero de 2011, 11:02:27 »
Como puedo testear eso?

Edito: No sale de ella, ya lo he probado.
Puedes explicarme estas dos lineas:

*palabra= CaracterLeido;
*palabra++;

Muchas gracias de nuevo.

  Sí, ayer se me pasó explicarte eso y también el porque había probado con el caracter '\f' en su momento....

  Primero te explico lo de los caracteres que me es más fácil  :)
  Cuando estaba haciendo pruebas con el terminal virtual de proteus noté que al poner en mi programa "putch(''\n);" no hacía nada, entonces pensé que había algún error y empecé a probar distintas cosas hasta que con el '\f' paració funcionar pero luego -recién en la noche- noté que el caracter '\f' servía para borrar la pantalla del terminal virtual. Después de eso debugge el programa y vi que cuando ponía '\r' enviaba el dato 13 (0x0d) y al poner '\n' envía el dato 10 (0x0a).

  Ahora lo más complejo, espero que pueda hacerme entender  :?

  Es algo bastante complejo porque está relacionado con el uso de punteros. Cuando se trabaja con punteros se puede hacer uso de & o *. & se usa para referirse a una dirección de memoria y * se para referirse al un dato. A ver si con un ejemplo me explico mejor.

Código: C
  1. volatile char * puntero; // declaro una variable del tipo puntero
  2.  
  3. puntero = &PORTB; //hago que el puntero apunte a la direccion del puerto B
  4.  
  5. *puntero = 255; // esto cambia el dato que se encuentra en la direccion a la cual apunta el puntero

  A efectos prácticos, el "*puntero = 255;" pone a 255 el puerto B. El puntero apunta al puerto B, y al cambiar el dato de la dirección apuntada por el puntero, cambiamos el dato del puerto B.

 Ahora vamos al caso de mi función.

  con "*palabra = CaracterLeido" hago que el dato apuntado por el puntero sea el caracter leído
y con "*palabra++" incremento el índice del puntero.

  Esto es equivalente a, en un array ir aumentando el indice.
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 #64 en: 18 de Enero de 2011, 11:08:10 »
Lo he entendido bien. Ahora hablare con mi profesor para ver si podemos conseguir observar que es lo que se envia con el "OK" de vuelta. Cuando lo sepamos espero que problema solucionado...

Por otra parte, entonces en la parte de la funcion que pone \f lo quito no? y lo sustituto por \n,  no?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #65 en: 18 de Enero de 2011, 11:21:40 »
Lo he entendido bien. Ahora hablare con mi profesor para ver si podemos conseguir observar que es lo que se envia con el "OK" de vuelta. Cuando lo sepamos espero que problema solucionado...

Por otra parte, entonces en la parte de la funcion que pone \f lo quito no? y lo sustituto por \n,  no?

  Sí, exacto.
 
  También estaba pensando en otro formato para la función. Ya que si esperamos 6 caracteres pero el dispositivo sólo te envía un mensaje que contiene menos caracteres se te va a quedar colgada.
  El nuevo formato podría ser algo así...

Código: C
  1. // dejo pasar dos getch() porque serian los dos caracteres que preceden el mensaje del dispositivo
  2. do
  3. {
  4.   CaracterLeido = getch();
  5.   if ((CaracterLeido ! = '\r') && (CaracterLeido != '\n'))
  6.   {
  7.     *palabra = CaracterLeido;
  8.     *palabra++;
  9.   }
  10. // el if esta para no almacenar en la variable los caracteres de "CarrierReturn" y "LineFeed"
  11.  
  12.   *palabra = '\0'; // esto esta para asegurarme de terminar la variable con el carecter nulo, que es el utilizado para indicar el fin de un string
  13. }
  14. while (CaracterLeido != '\n');// solo sale del while cuando se recibe el "LineFeed" que seria el ultimo caracter enviado por 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 #66 en: 18 de Enero de 2011, 11:55:02 »
Con esta nueva variante de la funcion me vuelvo a quedar dentro... he puesto un buffer de 10 porque ahora da igual el tamaño y me quedo dentro..

Edito: Creo que hay un error.. a cada lectura va poniendo *palabra = '\0'; no?
« Última modificación: 18 de Enero de 2011, 11:58:43 por edu1989 »

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #67 en: 18 de Enero de 2011, 15:06:21 »
Sabes de algun programa que me permita enviar los comandos AT y ver la respuesta entera del modulo? o que me permita verla en hexadecimal...

Gracias!

Desconectado edu1989

  • PIC18
  • ****
  • Mensajes: 275
Re: Error al comparar dos strings con strcmp
« Respuesta #68 en: 18 de Enero de 2011, 15:41:06 »
He encontrado un programa que me ha permitido saber que es lo que ocurre en la sequencia AT y contestacion "OK"
Exactamente copio textualmente del terminal

Read data:
00000000: 41 54 0d 0d 0a 4f 4b 0d  |  0a 0a                    AT...OK...

De los cuales:

 41 54 0d correspoden a AT y el salto de carro
0d 0a 4f 4b 0d  |  0a 0a  corresponden al OK con todo lo que lleva.

Lo que no entiendo bien es que pinta esa "barra" que separa a los caracteres 0a 0a..

Lo entiendes tu, Angel?

Segun esto tanto pueden ser 5 6 7 o 8 caracteres. Lo he probado con todas las opciones y sigue sin funcionar...
« Última modificación: 18 de Enero de 2011, 16:03:51 por edu1989 »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #69 en: 18 de Enero de 2011, 16:59:43 »
  ¿Esa secuencia que mostrás es toda la respuesta del dispositivo?

  No entiendo la barra. 0x0a es el código de "LineFeed" así que por lo que parece la respuesta terminaría con un doble "LineFeed"
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 #70 en: 18 de Enero de 2011, 17:12:25 »
Es eso lo que no entiendo bien. Yo pongo AT + enter y me devuelve todo eso...
Creo e imagino que la barra separara las palabras ( ya que son de 8bits). Si te fijas hay 8 bits la barra y dos mas

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #71 en: 18 de Enero de 2011, 17:16:22 »
  Imagino que habrás querido decir 8 bytes, ya que 8 bits forman cada caracter.
¿Tendrás el datasheet del dispositivo o alguna dirección en donde poder verlo? Como para tratar de ver como tiene que responder
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 #72 en: 18 de Enero de 2011, 17:18:16 »
Perdon si, bytes.
Que quieres que mire en el datasheet exactamente?

En el datasheet viene toda la lista de comandos AT con la explicacion...
De la manera como contesta solo hay eso que te explique. Contesta con retorno de carro y linefeed antes y despues dl OK ( segun el datasheet). Aqui estamos viendo que no es asi..

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Error al comparar dos strings con strcmp
« Respuesta #73 en: 18 de Enero de 2011, 17:19:33 »
  No, lo quiero mirar yo para ver si puedo encontrar algo que se me esté escapando.
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 #74 en: 18 de Enero de 2011, 17:20:41 »
Subo la info en un zip ok? Todo viene en un cd y no esta en ninguna pagina.

Edito: Mientras voy guardando toda la info para subirla te dejo una prueba que he hecho antes con ese terminal que me permite ver lo que recibo.
En esta prueba he puesto los 8 comandos ( at, ats0=1 etc...) el resultado es este:

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                         

Edito otra vez: No puedo subir la info porque el documento ( comprimido) tiene mas de 250kb. Si me puedes dar tu correo por privado te lo envio todo. Es que ese es solo un documento de unos quantos que hay.
Dime de que manera quieres hacerlo sino.


Muchas gracias
« Última modificación: 18 de Enero de 2011, 17:40:20 por edu1989 »