Operación muy básica de Arduino Uno Serial.readString ()

Soy muy nuevo en la programación de Arduino. Estoy tratando de identificar la cadena de entrada del monitor en serie e imprimir la salida en la consola en consecuencia

El código es:

void setup() { Serial.begin(9600); } void loop() { while (Serial.available() > 0 ) { String str = Serial.readString(); if (str.equals("send")) { Serial.println("identified"); } else { Serial.println("unknown"); } } } 

Siempre que Ponga la cadena de envío que muestra «desconocido» como salida, lo cual es incorrecto, y debería ser «identificado» como salida. ¿Alguien puede guiarme aquí para lograr el resultado?

Nota: estoy obteniendo la salida como quería usando la función readStringUntil pero las cadenas tienen mucho «.» en él, por lo tanto, no es útil.

Comentarios

  • ¿Cuál es su configuración de final de línea en Serial Monitor?
  • tanto NL como CR.
  • luego verifique " send / r / n "
  • Quieres decir \r\n no /r/n
  • El problema de confiar en cosas como readString es que realmente no ' No sé lo que están haciendo ni cómo funcionan. Analice los datos entrantes manualmente para saber con qué está trabajando.

Responder

Si establece la línea de su monitor serial que termina en «Ambos NL & CR», este código encontrará la palabra «enviar». NO encontrará la palabra «enviar» en esta cadena, «ssend» o en esta cadena, «sendd».

void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.substring(0) == "send\r\n"){ Serial.println("identified");} else{ Serial.println("unknown"); } } } 

Si desea encontrar la cadena «enviar» en «1234send» o «send1234» o «1234send5678» luego use indexOf ();

void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.indexOf("send") > -1){ Serial.println("identified");} else{ Serial.println("unknown"); } } } 

Respuesta

Hay cualquier número de razones por las que la prueba * .equals es falsa. Considere la diferencia entre mayúsculas y minúsculas o los caracteres adicionales introducidos desde la fuente de sus comunicaciones. Incluso los caracteres no imprimibles pueden plantear un problema y hacer que la prueba falle.

Considere utilizar * .substring () en su lugar. Este método devolverá verdadero si se encuentra la subcadena. Por ejemplo:

 String stringOne = "12345 send 1234"; // substring(index) looks for the substring from the index position to the end: if (stringOne.substring(0) == "send") { Serial.println("identified"); } else { Serial.println("unknown"); } 

… siempre debería devuelve «identificado» porque los caracteres «s», «e», «n» y «d» se encuentran en la secuencia correcta dentro de la cadena stringOne.

Comentarios

  • String str = Serial.readString (); if (str.substring (0) == " enviar ") Serial.println (" identificado "); else Serial.println (" desconocido "); esto no funcionó incluso.
  • Extraño. ¿Miró la página web vinculada a para asegurarse de que estaba utilizando la subcadena correctamente? ( ¿Esta página web? ). Además, veo en los comentarios que imprimiste la cadena recibida y viste " send " en el mensaje recibido, ¿correcto? Es posible que solo desee comentar la línea de lectura en serie e intentar usar " String str = " 12345 enviar 1234 "; " para probar si todo funciona. A juzgar por otros comentarios, puede intentar enviar rápidamente (escribiendo) " espacio " + " enviar " + " espacio " (" envíe ") para ver si funciona.
  • Eso no ' no funcionará. substring (n) solo devuelve la parte de la cadena que comienza en la posición n. Entonces, substring (0) solo devuelve una copia de la cadena. str.substring (0,4) devolverá los primeros 4 caracteres de la cadena (suponiendo que haya al menos 4 caracteres para devolver – yo ' no estoy lo suficientemente familiarizado con esta implementación para saber qué lo hace para una cadena más corta (C # arrojaría una excepción).

Respuesta

void setup() { Serial.begin(9600); } void loop() { char inChar[5]; if(Serial.available() > 0 ) { for (int i=0; i<5; i++) { inChar[i] = Serial.read(); delay(10); } if (inChar[0] == "s" && inChar[1] == "e" \ && inChar[2] == "n" \ && inChar[3] == "d") { Serial.println("identified"); } else { Serial.println("unknown"); } } } 

Comentarios

  • Leyendo la cadena " enviar " el uso del comando Serial.readString () está bien. Pero de alguna manera no funcionará si usa el resultado para comparar (por ejemplo, data == " send " …). Una posible solución es utilizar una matriz de caracteres (por ejemplo, inChar [5]). El tamaño de la matriz es 1 más que el máximo de caracteres necesarios.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *