Pregunta

Tengo un Arduino enviando y recibiendo instrucciones con un script Python a través de un puerto serie.

El Arduino toma un estado de botón y cuando se presiona, enviará un mensaje a través del puerto serie a un script de Python y esperará una respuesta. (a través de Serial.available () ). Funciona bastante bien.

Sin embargo, si la secuencia de comandos de Python se ha bloqueado por cualquier motivo (idealmente se ejecutará en segundo plano, por lo que no se puede comprobar fácilmente), Arduino esperará para siempre y no estará disponible incluso en un reinicio de secuencia de comandos.

¿Hay alguna forma de que mi Arduino verifique si hay algo escuchando en el puerto serie? (y alertarme con luces intermitentes, etc. si no) o ¿no es así como funciona en serie? En el peor de los casos, supongo que podría usar un tiempo de espera, aunque eso no es lo ideal.

¿Fue útil?

Solución

Tiene una capacidad limitada para detectar si hay algo escuchando en el otro lado utilizando los pines DSR / DTR.

Cuando abre el puerto serie en la máquina en la que se ejecutan sus scripts, debería elevar su pin DTR (o debería ser capaz de convencerlo de que lo haga: la documentación de la biblioteca que utiliza para controlar el puerto COM debería indicarle usted cómo).

Luego, en su Arduino, puede verificar su pin DSR (suponiendo un cableado de módem nulo con apretón de manos, donde el pin DTR de la PC está conectado a DSR + CD en el Arduino) a intervalos regulares, y manejar el 'nadie conectado' escenario de la forma que mejor le parezca.

Un problema con este enfoque es que el script de su PC puede no cerrar el puerto serie cuando se bloquea / deja de responder, dejando el pin DTR habilitado como si todo estuviera bien. Además, su script puede simplemente perder el mensaje del Arduino debido a errores en la línea serial.

Por esa razón, debe siempre 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 que la respuesta te llegará intacta).

Reenviar 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.

Otros consejos

El Arduino no utiliza la línea DSR ni ninguna otra línea de comunicación, por lo que no puede hacer lo que sugiere.

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 Ping-Pong de ircd).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top