Declaraciones if anidadas en serie (no funcionan)

He estado tratando de hacer que esto funcione durante unos días.

Lo que tengo en este momento es TouchOSC instalado en mi iPhone enviando comandos a un programa de procesamiento, que a su vez los simplifica y los envía a mi Arduino a través de la serie.

Aquí es donde está mi problema. Los comandos llegan allí y puedo imprimirlos con bastante facilidad. Llegan correctamente. El formato es t11 o t10 (t para alternar el control, luego # para cambiar la identificación del control, el último # está activado o desactivado (1 o 0).

Ahora, cuando intento desglosar esto con declaraciones if, parece que nunca funciona. Sé que los datos son correctos cuando llegan al Arduino.

Necesito probar si el primer carácter es una declaración 't' simple if

if(Serial.read() == 't')

antes de esto pruebo si

Serial.available()

es cierto entonces a través de declaraciones if similares, pruebo si el siguiente es el número '1' o '2' para la identificación de control, luego si el número está activado o desactivado, '1' o '2'.

Cuando pruebo esto en el monitor en serie o con datos reales de mi teléfono, parece que nunca entra en los bucles o lo llevará a uno y no al otro. A veces puedo modificarlo para entrar en todos ellos para encender el LED, pero luego no lo apague o viceversa.

¿Alguien puede darme un ejemplo de la lógica que necesito usar? También he intentado usar declaraciones de cambio para que la ID no parezca hacer mucha diferencia.

¿Puedes publicar el código de tu analizador?

Respuestas (2)

Sin ver su código, estoy adivinando, pero sospecho que está ingresando el código para analizarlo antes de tener un comando serial completo disponible. Entonces, a veces solo hay 1 byte disponible y, a veces, los 3 están allí, de ahí el comportamiento impredecible.

Cambiaría la primera prueba por la siguiente:

if (Serial.available() >= 3)

Que esperará hasta que tenga presente un comando completo antes de realizar todas las pruebas.

/año

Eso funciona perfectamente. Gracias por la explicación igualmente. Ahora sé que estaba actuando antes de que llegara todo el mensaje en serie. Tanto dolor de cabeza para algo tan simple.

Aunque no estoy familiarizado con la programación de Arduino, si tiene una serie de declaraciones if como if(Serial.read() == 't') entonces creo que la primera probablemente esté engullendo el carácter del puerto serie, y en la próxima prueba si (Serial.read() == '1') el puerto estará vacío y el carácter desaparecerá.

En su lugar, desea guardar el carácter en una variable y luego probar la variable:

ch = Serie.leer(); si (ch == 't') ... si no (ch == '1') ...

etc.

De acuerdo, nunca es una buena idea leer en la declaración if. Lo mejor es esperar a que un comando esté disponible y leerlo en bloques para que pueda reutilizarlos en otras pruebas. Especialmente si termina haciendo if (Serial.read() == 't') ... if (Serial.read() == 'x') .... donde la segunda lectura contendría un número del comando y ya no es el carácter de comando.