Pages: [1]   Go Down
Author Topic: Cadenas de carácteres iguales pero diferentes. ¿Alguna explicación?  (Read 2309 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
Enginyeria Geek
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!!


« Last Edit: April 29, 2012, 06:01:00 pm by coleoptero » Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 712
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Para comparar dos cadenas de caracteres tienes la función strcmp(), que devuelve cero si son iguales
Code:
if (strcmp(MI_DIRECCION, trama[1]) == 0) {Serial.print("Son iguales");}
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Si MI_DIRECCION es 1, te devolverá:
Code:
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.
Logged

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
Enginyeria Geek
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¿Que tienes en MI_DIRECCION?
Logged

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
Enginyeria Geek
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Una cadena de hasta 10 carácteres, por ejemplo: DISPOS1
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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í.....

smiley-wink
« Last Edit: January 29, 2011, 03:04:39 pm by Igor R » Logged


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
Enginyeria Geek
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok!!
 smiley-eek
Logged


Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Me había imaginado que era un número/letra, por lo de trama[1], ya que sólo estabas comparando 1 carácter.
Logged

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
Enginyeria Geek
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: