serial-port - recibir - puertos seriales arduino mega
Compruebe si el puerto serie está escuchando (3)
Tengo un Arduino enviando y recibiendo instrucciones con un script de Python a través de un puerto serie.
El Arduino toma un estado de botón y cuando se lo envía, envía un mensaje a través del puerto serie a un script de Python y espera una respuesta. (a través de Serial.available()
). Funciona bastante bien.
Sin embargo, si el script de Python se ha bloqueado por cualquier motivo (idealmente se ejecutará en segundo plano, por lo que no se puede verificar fácilmente), el Arduino esperará por siempre y no estará disponible incluso en un reinicio del script.
¿Hay alguna manera para que mi Arduino compruebe si hay algo escuchando en el puerto serie? (y avísenme con luces intermitentes, etc. si no) o ¿no es así como funciona la serie? En el peor de los casos, creo que podría usar un tiempo de espera, aunque eso no es ideal.
Estoy de acuerdo con mdb en que los tiempos de espera son necesarios, pero también agregaría que es posible que desee implementar un sistema simple de desafío / respuesta que verifique periódicamente si alguien está escuchando. (Me gusta la analogía de Ping-Pong de ircd).
Tiene una capacidad limitada para detectar si hay algo escuchando en el otro lado utilizando los pines DSR / DTR.
Cuando abre el puerto serie de la máquina en la que se ejecutan las secuencias de comandos, debe subir su pin DTR (o debería poder convencerlo de que lo haga: la documentación de la biblioteca que utiliza para controlar el puerto COM debería indicarle cómo) .
Luego, en su Arduino, puede verificar su pin DSR (asumiendo el cableado null-modem con handshaking, donde el pin PC DTR está conectado a DSR + CD en el Arduino) a intervalos regulares, y manejar el escenario ''nadie conectado'' en cualquier forma en que lo ves en forma.
Un problema con este enfoque es que la secuencia de comandos de su PC no puede cerrar el puerto serie cuando se bloquea / deja de responder, dejando el pin DTR habilitado como si todo estuviera bien. Además, su secuencia de comandos puede simplemente perder el mensaje de Arduino debido a errores en la línea serie.
Por esa razón, siempre debe implementar un tiempo de espera en sus rutinas de recepción: incluso si hay una parte escuchando en el otro extremo, no hay garantía de que haya recibido su mensaje (o de que su respuesta lo alcance intacto).
Volver a enviar el mensaje al menos una vez (suponiendo que se genere DSR) si se produce un tiempo de espera, hace que su protocolo sea más confiable.
Arduino no usa la línea DSR o cualquier otra línea de handshaking, por lo que no puedes hacer lo que sugieres.