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:
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).
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.
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
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')