Problema Serial con if.(SOLUCIONADO)

Este código almacena en un string la cadena de 4 que recibe por serie. Luego lo compara con las claves del programa y hace una cosa u otra...

char cadena[4];
byte contador=0;

char usuario[4]={'1','2','3','4'};
char cambio[4]={'1','1','1','1'};

void setup(){Serial.begin(9600);}

void loop()
{
if(Serial.available())
{
while (Serial.available()>0)
{
delay(5);
cadena[contador]=Serial.read();
contador++;
}

contador=0;

if (cadena[1]==cambio[1]&&cadena[2]==cambio[2]&&cadena[3]==cambio[3]&&cadena[4]==cambio[4])
{

Serial.print("Z");
}

if (cadena[1]==usuario[1]&&cadena[2]==usuario[2]&&cadena[3]==usuario[3]&&cadena[4]==usuario[4])
{

Serial.print("X");
}

}
}

El problema es que sólo hace caso si envío 1111, es decir, sólo hace caso al primer if.
Gracias por su atención.

Hola,

  • Para almacenar "1111" necesitas reservar sitio para 5 caracteres, porque siempre se pone el null final ('\0')
    char cadena[5], usuario[5], cambio[5]
    Si no concretas el espacio,
    char cambio[] = "1234";
    el compilador tomará el espacio necesario (los 5 bytes).

  • para señalar un lugar en la cadena, el índice empieza de 0, y en tu caso va hasta 3
    if (cadena[0 ]== cambio[0] etc.

Prueba haciendo los cambios. También podríamos hablar de enviar una cadena por serial, pero mejor después.

Qué cosas! El caso es que de haberme leído las referencias lo sabía, pero como funcionaba pues no había caído. Muy bien @curo92, hago cambios y comento como ha ido.
Gracias por tu interés!

Como bien dice @curro92 el error está en el tamaño. El primer if funciona porque son todo 1, pero el segundo no porque son números diferentes y no coinciden. La solución ha sido,efectivamente, poner los tamaños adecuados para que el comparador de cadenas afirme uno a uno todos los números.
Gracias @curro92, un saludo! +1

(¿Es posible trasladar este post a Software?)