Go Down

Topic: Cadenas de carácteres iguales pero diferentes. ¿Alguna explicación? (Read 2 times) previous topic - next topic

Engeeknyer

Jan 29, 2011, 07:34 pm Last Edit: Apr 30, 2012, 01:01 am by coleoptero Reason: 1
Buenas...

Estoy liado en un proyectillo. Este tiene una parte que contiene un protocolo de comunicación que consiste en asignar a arduino una direcció. Si recibedatos por el puerto serie que vayan destinados a el debe ejecutar unas ordenes concretas.
Digamos que el aspecto de los mensajes que envia y recibe por el puerto serie tiene el aspecto siguiente:

ORIGEN, DESTINO, COMANDOS

En consecuencia mi proyecto debe mirar si el DESTINO que recibe por el puerto serie concuerda con la variable interna de su dirección y ejecutar los comandos que sean. Hasta aquí claro ¿verdad?

Pues bién, recibo correctamente los datos y los meto en un objeto String. De este objeto String los 'descuartizo' a traves de la separación de las comas. Y por último convierto los sub-Strings obtenidos, en cadenas de caracateres dentro de un array, de manera que trama[0] contiene ORIGEN, trama[1] contiene DESTINO y trama[2] contiene los COMANDOS.

Si hago

Serial.println(MI_DIRECCION);
Serial.println(trama[1]);


obtengo el mismo resultado: DESTINO
Que es lo que debe ser.

En cambio si ejecuto:

if (MI_DIRECCION==trama[1]) {Serial.print("Son iguales");}

No me reconoce que las dos cadenas sean iguales.
Ya he comprobado que no existan carácteres 'en blanco' (LF, CR,....) delante o detrás de las cadenas...
¿Alguién se le ocurre que puede causar que dos cadenas que son iguales, Arduino no las vea igual?

Gracias!!



curro92

Para comparar dos cadenas de caracteres tienes la función strcmp(), que devuelve cero si son iguales
Code: [Select]

if (strcmp(MI_DIRECCION, trama[1]) == 0) {Serial.print("Son iguales");}


chiva

Cambia las líneas a lo siguiente:
Code: [Select]
Serial.println(MI_DIRECCION,HEX);
Serial.println(trama[1],HEX);


Si MI_DIRECCION es 1, te devolverá:
Code: [Select]
1
31


Si es así tienes que tener en cuenta que ese 1 de trama[1] lo tienes codificado en ASCII al ser un carácter, por lo que no es un 1, si no un 31, réstale 30 y ya podrás comprarlos.
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Engeeknyer

Gracias por las rápidas respuestas,

curro92: me fué a la perfección. Y acabo de sacar una GRAN conclusión: no saco partido del C!!
chiva: no he entendido tu respuesta. Pero ya esta. La solución de curro me ha ido a las milñ maravillas.

Reitero: gracias a los dos!

chiva

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Engeeknyer


Igor R

Guau!! 10 carácteres para tener una dirección? Por qué no lo mandas en forma de byte (no ascii), y puedes tener hasta 255 diferentes dispositivos y solamente usando 1 byte??
Es decir, cada dispositivo le corresponde un número (del 0 a 255).
Para mandar por puerto serie es Serial.print(direccion,BYTE) dónde dirección es tu número de dispositivo.
Cuando lo recibas es tan sencillo como comparar dos números....

Por cierto, usando la consola serie que viene con Arduino, siempre verás el cáracter (ASCII) que le corresponde al número que has enviado. Ésto puede llegar a ser muy confuso.... Te recomiendo usar RealTerm.

Bueno, todo esto es asumiendo que estas creando el protocolo tu mismo y no estas usando algo que ya te viene así.....

;)

Engeeknyer

Pués no mando un byte de dirección porque el protocolo que quiero implementar me lo exije así. Condiocnion de diseño obliga.

Salut



chiva

Me había imaginado que era un número/letra, por lo de trama[1], ya que sólo estabas comparando 1 carácter.
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Engeeknyer

Gracias de todas maneras Igor por la colaboración.

chiva: Ya me lo he imaginado, pero no... Con trama[1] unicamente hago referencia al primer elemento del array trama, donde trama son diferentes cadenas, que se transmien y reciben en serie como una unica cadena.

Go Up