Comando para leer el Monitor, no sirve?

Hola! Tengo un problema. "Arme" un codigo para saber que se manda en el monitor (una vez apretado Enter). Y segun que se escribe, suceden cosas. Teniendo en cuenta este codigo que si funciona:

void loop()
{
  if(Serial.available()){
    String a = Serial.readString();
    Serial.println(a);
    Serial.print("funcionando");
    }
  }
}

Explicacion: al nosotros escribir una palabra en el monitor y preisonar Enter, esa palabra va a ser la variable a. Cuadno se precone Enter, tambien se va a devolver el valor de a

Serial.println(a);

y la palabra "funcionando" escrita.

Ahora tieniendo en cuenta esto, siguiendo la lógica, hice esto:

void loop()
{
  if(Serial.available()){
    String a = Serial.readString();
    if (a=="funciona"){
      Serial.print("funcionando");
    }
  }
}

En este caso, si nosotros mandamos una palabra en el monitor, este analiza si lo que se mandó es "funciona". Si es asì, va a escribir "funcionando". Pero al probar el código, no devuelve la palabra por mas de que se escriba "funciona". ¿Por que? ¿Alguna solución? Desde ya gracias.

¿Quieres hacer "eco" de lo que vas escribiendo, o comparar la palabra entrante?

El monitor serial de Arduino no envía nada hasta que se presione Enter, ¿lo sabías?
Ahora, para comprobar igualdad entre cadenas de caracteres, tienes equals (peteneciente a la clase String) o strcmp (para vectores de char).

Hola! Ahí reedité el post aclarando el problema.

Si aún así no hay cómo, insisto en que uses equals.

if (a=="funciona"){

Esto solo compara punteros de memoria; y como nunca van a estar exactamente en el mismo lugar, la condición nunca se cumple.
Contradice un poco el sentido común, lo sé; pero resulta que así de "especial" es el compilador.

Probe con equals de la siguiente forma

void loop() {
  if(Serial.available()){
    String a = Serial.readString();
    if(a.equals("cambiar")){
      Serial.print("funciona");
    }
  }
}

Pero aún así no funciona. No se que otra solución podría ser...

Se te ocurrió la simpleza de ver que esta leyendo tu comando?

void loop() {
  if(Serial.available()){
    String a = Serial.readString();
    Serial.print("He leido: ");
    Serial.println(a);
    if(a.equals("cambiar")){
      Serial.print("funciona");
    }
  }
}

De este modo puedes VER que esta llegando. Ojo.. si hay caracteres raros no los vas a ver. ni comparar
Raros serían el CR (carriage return) y el LF (Line feed) o sea un 0x0a y 0x0d

Yo he modificado levemente tu código y obtuve un buen resultado asi

String a = ""; 

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

void loop() {
  

  if (Serial.available()) {
  	  a = Serial.readStringUntil('\r');
      
 	  Serial.print("Lei:");
 	  Serial.print(a);
      if (a.equals("cambiar")){
          Serial.print("funciona");
          a = ""; 
      }
   }
}

Luego te haré algunos comentarios de los errores cometidos

En tu código el agregado de esto a.trim(); resuelve el problema. trim() le quita justamente esos caracteres de LF y CR.

asi que a tu código le sumas

void loop() {
  if(Serial.available()){
    String a = Serial.readString();
    a.trimm();
    if(a.equals("cambiar")){
      Serial.print("funciona");
    }
  }
}

y funciona!!
Resta resolver el tema del timeout que para mi gusto es horrible lo que tarda en reaccionar. Por eso me gusta la versión con Serial.readStringUntil('\r')