Hola, nos pidieron que programemos algo que cuando ingreso algo en el monitor serial imprime Hello world pero el problema es solo imprime hola mundo bajo las condiciones de que su entrada en el monitor de serie sea una entrada de 3 bits y después de eso necesito tener un código que luego impida que se imprima una y otra vez. mi único problema es que realmente no sé cómo contar el número de bits de una entrada y también cómo evitar que se imprima continuamente.
void setup() { Serial.begin(9600); } void loop() { String readSerial; String input; while(Serial.available() > 0){// put your main code here, to run repeatedly: delay(2); input.concat(String((char)Serial.read())); return input; } Serial.println("HELLO WORLD"); }
Comentarios
- ¿Es esta una tarea de la clase de la escuela?
- Por favor, agregue su código.
- Sí, lo es. Y también es una tarea antes de la lección real
- ¿Qué quieres decir exactamente con entrada de 3 bits? La interfaz serial solo envía bytes completos. ¿Se trata de valores específicos en 3 de los 8 bits de un solo byte?
- aquí dice que 3 caracteres listos para ser leídos (bytes) ¿son 3 bits? ¿O estoy equivocado?
Respuesta
A juzgar por los comentarios, te quedas atrás en algunos conocimientos básicos. Para aprender realmente lo que se supone que debes aprender en esta tarea, debes revisar tu material de aprendizaje o los tutoriales de C / C ++ y Arduino en la web .Aquí solo te daré algunas pistas con razonamiento, que pueden ayudarte a resolver la tarea asignada. (Desafortunadamente naturalmente no está muy claro cuál es exactamente la tarea aquí)
- La interfaz
Serial
de Arduino (una interfaz UART) envía los datos en bytes, uno a la vez y uno tras otro (de ahí el nombreserial
). 1 byte es una serie de 8 bits, cada uno de ellos con un valor de 1 o 0. Juntos, los 8 bits forman un valor, que también se puede expresar como un valor decimal de 0 a 255. Por ejemplo,01001011
es el equivalente binario del número decimal 75. (Para obtener más explicaciones, busque en Google el sistema numérico binario) Los datos de bytes también se pueden expresar como caracteres, como se definen en el estándar ASCII. Cada valor binario se refiere a un carácter específico. Esto es lo que sucede en el monitor serial del Arduino IDE. (Para más explicaciones, google ASCII) - Dado que los datos se envían en serie, pueden aparecer algunos retrasos en la transmisión, que son imperceptibles para los humanos, pero el Arduino es lo suficientemente rápido, por lo que el
Serial.available()
puede devolver 0, porque en ese momento ocurrió un pequeño retraso en la transmisión. Por lo tanto, es importante captar todo el mensaje antes de intentar trabajar con él. Puede hacer esto contando bytes (esperando hasta que al menos 3 bytes estén disponibles en el búfer) o marcando el final del mensaje con un carácter especial (por ejemplo, el carácter de nueva línea «\ n»). Hay muchos tutoriales en la web sobre cómo hacer ambas cosas. Puede comenzar con el blog de Majenko . - Puede obtener la cantidad de bytes que se recibieron, con el valor de retorno de
Serial.available()
. Devolverá 3, cuando haya 3 bytes listos para ser leídos en el búfer. - Si define una variable dentro de
void loop()
, se desechará cuando la función finalice y se redefinirá, cuando la función comience de nuevo (en el mundo Arduino, la funciónvoid loop()
se llama una y otra vez para siempre) . Perderá todo el contenido que se escribió en esta variable. Si desea conservar los datos sobre las ejecuciones de la funciónvoid loop()
, puede definir la variable fuera de cualquier función en el parte superior de su programa. Esta variable es global y se definirá solo una vez al inicio del programa y se mantendrá durante toda la vida útil del programa. - Como se escribió en el comentario, no debe devolver un valor desde una función
void
, s incevoid
significa principalmente que no hay valor de retorno. Y regresar de la funciónvoid loop()
solo reiniciará esta función (ya que estamos en el mundo Arduino). - Puede deshacerse de la
delay(2)
. No hay necesidad de ello. Y si solo funciona con el retraso, entonces algo más no es correcto y solo está trabajando con los síntomas en lugar del problema real.
Además, no debe intentar construir todo en su Poseer y reinventar la rueda. En su lugar, intente mirar los ejemplos que vienen con el IDE de Arduino. Por ejemplo, el ejemplo SerialEvent
, que muestra cómo recibir un mensaje en serie (que termina con un carácter de nueva línea «\ n»). También eche un vistazo a los otros ejemplos relacionados. Si comprende cómo funcionan, podrá realizar la tarea sin ningún problema.
Comentarios
- Hola de nuevo, creo que ' Estoy cerca de conseguirlo, pero de todos modos hay una pregunta rápida para restablecer el serial.available (); valor y revertirlo a 0?
- Puede hacer
Serial.read()
sin usar el valor devuelto, hasta queSerial.available()
devuelva 0.
Respuesta
Suponiendo que el boceto debe imprimir «Hola mundo» cuando el carácter de entrada tiene 3 bits de alto. Aquí hay algunas variantes diferentes de contar el número de bits establecidos en un byte.
int bits1(int c) { int res = 0; for (int i = 0; i < 8; i++) { if ((1 << i) & c) res = res + 1; } return (res); } int bits2(int c) { int m = 0x80; int res = 0; do { if (m & c) res++; } while (m >>= 1); return (res); } int bits3(int c) { int m = 0x80; int res = 0; do { res += (m & c) != 0; } while (m >>= 1); return (res); } #define bits4(c) __builtin_popcount(c) #define bits bits4 void setup() { Serial.begin(9600); while (!Serial); } void loop() { if (Serial.available() > 0) { int c = Serial.read(); if (bits(c) == 3) { Serial.print((char) c); Serial.print(":"); Serial.print(c, BIN); Serial.println(": Hello World"); } } }