Problema con varios boolean (SOLUCIONADO)

char cadena[5];
byte contador=0;

boolean modo1=true;
boolean modo01=false;
boolean modo2=true;
boolean modo02=false;
boolean modo3=true;
boolean modo03=false;

char usuario[5]={3,3,3,3};

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

void loop()
{

/////////////////////////////////////////////////////////////////////////////////////////////////
// COMUNICACION
/////////////////////////////////////////////////////////////////////////////////////////////////

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

/////////////////////////////////////////////////////////////////////////////////////////////////
// MODO1
/////////////////////////////////////////////////////////////////////////////////////////////////

if (cadena[0]=='P'){modo1=true;}

if (modo1==true)
{

if(cadena[0]-48==usuario[0]&&cadena[1]-48==usuario[1]&&cadena[2]-48==usuario[2]&&cadena[3]-48==usuario[3])
{
modo01 = !modo01;
digitalWrite(13, modo01);
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////
// MODO2
/////////////////////////////////////////////////////////////////////////////////////////////////

if (cadena[0]=='N'){modo2=true;}

if(modo2==true)
{
if(cadena[0]-48==usuario[0]&&cadena[1]-48==usuario[1]&&cadena[2]-48==usuario[2]&&cadena[3]-48==usuario[3])
{
modo02=!modo02;
digitalWrite(7,modo02);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
// MODO3
/////////////////////////////////////////////////////////////////////////////////////////////////

if (cadena[0]=='Y'){modo3=true;}

if (modo3==true)
{
if(cadena[0]-48==usuario[0]&&cadena[1]-48==usuario[1]&&cadena[2]-48==usuario[2]&&cadena[3]-48==usuario[3])
{
modo03=!modo03;
digitalWrite(6,modo03);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

}//serial

}//void

-Recibe P, después recibe código y activa/desactiva led del pin 13
-Recibe N, después recibe código y activa/desactiva led del pin 7
-Recibe Y, después recibe código y activa/desactiva led del pin 6

Eso es lo que debería de hacer. Lo que hace es activar/desactivar todos los leds sea el modo que sea.

¿Alguna solución?
Gracias de antemano por vuestra atención.

Perdona, pues ahora mismo no puedo mirar tu código más a fondo, pero echo de menos que después de entrar en alguno de los modos, desactives la bandera modo porque creo que si no te va a volver a entrar en su if en el siguiente ciclo.
O bien
if (cadena[0]=='P'){modo1=true;} else {modo1=false;}

O bien
if (modo1==true)
{

if(cadena[0]-48==usuario[0]&&cadena[1]-48==usuario[1]&&cadena[2]-48==usuario[2]&&cadena[3]-48==usuario[3])
{
modo01 = !modo01;
digitalWrite(13, modo01);
}
** modo1=false;**
}

EDITO:
Me he dado cuenta de que, además, has definido modo1-modo3 como true, por lo que en cuanto envíes algo al serial, )va a ejecutar el código de los tres if (modo==true)
REQUETEEDITO:
En las líneas
if(cadena[0]-48==usuario[0]&&cadena[1]-48==usuario[1]&&cadena[2]-48==usuario[2]&&cadena[3]-48==usuario[3])
¿No deberías empezar a comparar a partir de cadena[1], ya que cadena[0] es el modo?
También deberías aumentar el tamaño de cadena, ya que si envías 1 bit de comando + 4 de código + \n del serial, salen 6 bytes.

Hola @noter. Muchas gracias por tu interés, de nuevo. Lo he resuelto de esta manera:

if (modo1==true)
{

if(cadena[0]-48==usuario[0]&&cadena[1]-48==usuario[1]&&cadena[2]-48==usuario[2]&&cadena[3]-48==usuario[3])
{
modo01 = !modo01;
digitalWrite(13, modo01);
modo1=false;
}

}

...es decir, saliendo de modo después de apagar/encender el led.

De nuevo muchas gracias noter, un saludo! +1
(¿Se puede mover el post a Software?)