#136
03-01-2016, 04:57 PM
Tenía ciertas dudas con el Arduino Pro Micro, que es uno de los que hemos recomendado para esto, en lo relativo al uso del puerto Serial.
La documentación y Google no me han servido de mucho. No quedó más remedio que recurrir al sistema de prueba y error para sacar las conclusiones.
Ya lo tengo todo claro. Las diferencias con otros Arduinos son muy llamativas, y la gente tiende a usar procedimientos similares a los usados en Arduino UNO, pero encontré una solución sencilla que me gusta bastante. Primero explico en qué consisten las diferencias con Arduino UNO.
Forma de iniciar la conexión Serial en un Arduino Pro Micro o Arduino Leonardo
En Leonardo no se reinicia al abrir la conexión, por ello cuando en el programa no introducimos una espera para detectar la apertura del puerto Serial, algunas trazas se perderán. Concretamente se irán perdiendo todas hasta que decidamos abrir el puerto y aparecerán las trazas que en ese momento se estén ejecutando, porque a diferencia de Arduino UNO, no se produce un reinicio del programa cuando se abre el puerto Serial.
Este comportamiento no es necesariamente algo malo, pero es un detalle que hay que conocer, y si estás acostumbrado a otros Arduinos te puede desconcertar bastante.
Si Arduino Micro (o Leonardo) se pone la espera y no se abre el Monitor Serial, el programa quedará detenido y no progresará. Quedará a la espera de que se abra la conexión y en el momento que esta se abra, proseguirá la ejecución con toda normalidad.
Para el uso del puerto Serial en una aplicación donde por ejemplo solo se use el puerto Serial para sacar trazas de ejecución, convendrá esperar durante un cierto tiempo a que el Monitor Serial se conecte, pero en caso de que dicho tiempo transcurra sin producirse la apertura del puerto, habrá que forzar el final de la espera y proseguir con la ejecución del programa asumiendo que lo que se envíe a Serial se perderá.
En otros Arduinos la apertura de un puerto implica un reset del programa. En Arduino Pro Mini (o Leonardo) eso no ocurre nunca, por eso se suelen poner las instrucciones de espera en setup() a fin de evitar que durante el transcurso de tiempo que va desde que empieza a ejecutarse hasta que activamos el monitor en el IDE, se pierdan algunos datos.
Esperar permanentemente ya hemos dicho que tampoco sería una buena idea porque si lo ejecutamos sin conexión al monitor Serial se quedará bloqueado.
Preguntar por la disponibilidad del puerto Serial en cualquier otro Arduino, siempre devolverá el valor true (cierto). Esto despista un poco, porque lo hace incluso cuando el puerto no está disponible.
Lo que ocurre, es que la disponibilidad de la conexión en Arduino UNO, no es tan importante para la inicialización del programa. Eso da lo mismo, porque cuando por fin se abra la conexión Serial, el programa se reiniciará y en caso contrario no tampoco se bloqueará y funcionará con la conexión cerrada.
Resumiendo:
Hacer en Arduino Pro Micro (o Leonardo) una espera indefinida, puede dar problemas. Pero no hacer ninguna espera también.
Lo más acertado sería hacer una espera con TIMEOUT (con tiempo limite).
Programando un tiempo de espera de 5 segundos como máximo, desparecen todos los inconvenientes y es raro que esto no sea un procedimiento perfectamente documentado.
He buscado en Google por Arduino Leonardo Serial TIMEOUT y no aparece nada. Es bastante sencillo. Yo temía tener que recurrir a soluciones más complicadas. La solución es la siguiente:
La documentación y Google no me han servido de mucho. No quedó más remedio que recurrir al sistema de prueba y error para sacar las conclusiones.
Ya lo tengo todo claro. Las diferencias con otros Arduinos son muy llamativas, y la gente tiende a usar procedimientos similares a los usados en Arduino UNO, pero encontré una solución sencilla que me gusta bastante. Primero explico en qué consisten las diferencias con Arduino UNO.
Forma de iniciar la conexión Serial en un Arduino Pro Micro o Arduino Leonardo
En Leonardo no se reinicia al abrir la conexión, por ello cuando en el programa no introducimos una espera para detectar la apertura del puerto Serial, algunas trazas se perderán. Concretamente se irán perdiendo todas hasta que decidamos abrir el puerto y aparecerán las trazas que en ese momento se estén ejecutando, porque a diferencia de Arduino UNO, no se produce un reinicio del programa cuando se abre el puerto Serial.
Este comportamiento no es necesariamente algo malo, pero es un detalle que hay que conocer, y si estás acostumbrado a otros Arduinos te puede desconcertar bastante.
Si Arduino Micro (o Leonardo) se pone la espera y no se abre el Monitor Serial, el programa quedará detenido y no progresará. Quedará a la espera de que se abra la conexión y en el momento que esta se abra, proseguirá la ejecución con toda normalidad.
Para el uso del puerto Serial en una aplicación donde por ejemplo solo se use el puerto Serial para sacar trazas de ejecución, convendrá esperar durante un cierto tiempo a que el Monitor Serial se conecte, pero en caso de que dicho tiempo transcurra sin producirse la apertura del puerto, habrá que forzar el final de la espera y proseguir con la ejecución del programa asumiendo que lo que se envíe a Serial se perderá.
En otros Arduinos la apertura de un puerto implica un reset del programa. En Arduino Pro Mini (o Leonardo) eso no ocurre nunca, por eso se suelen poner las instrucciones de espera en setup() a fin de evitar que durante el transcurso de tiempo que va desde que empieza a ejecutarse hasta que activamos el monitor en el IDE, se pierdan algunos datos.
Esperar permanentemente ya hemos dicho que tampoco sería una buena idea porque si lo ejecutamos sin conexión al monitor Serial se quedará bloqueado.
Preguntar por la disponibilidad del puerto Serial en cualquier otro Arduino, siempre devolverá el valor true (cierto). Esto despista un poco, porque lo hace incluso cuando el puerto no está disponible.
Lo que ocurre, es que la disponibilidad de la conexión en Arduino UNO, no es tan importante para la inicialización del programa. Eso da lo mismo, porque cuando por fin se abra la conexión Serial, el programa se reiniciará y en caso contrario no tampoco se bloqueará y funcionará con la conexión cerrada.
Resumiendo:
Hacer en Arduino Pro Micro (o Leonardo) una espera indefinida, puede dar problemas. Pero no hacer ninguna espera también.
Lo más acertado sería hacer una espera con TIMEOUT (con tiempo limite).
Programando un tiempo de espera de 5 segundos como máximo, desparecen todos los inconvenientes y es raro que esto no sea un procedimiento perfectamente documentado.
He buscado en Google por Arduino Leonardo Serial TIMEOUT y no aparece nada. Es bastante sencillo. Yo temía tener que recurrir a soluciones más complicadas. La solución es la siguiente:
Código:
#define TIMEOUT_SERIAL 5000 // Esperamos como máximo 5 segundos a la conexion Serial
// ************************************************************************************
void setup(){
Serial.begin(9600); // Intentamos inicializar a 9600 baudios
int t1=millis(); // Tomamos referencia del tiempo en t1
// Mientras no transcurran TIMEOUT_SERIAL milisegundos
while (millis()-t1<TIMEOUT_SERIAL){
if (Serial) // Si se ha logrado conexión...
break; // forzamos la salida del bucle
}
// Se permite continuar con conexión o sin ella.