2008-10-12 17 views
5

Tengo un Arduino enviando y recibiendo instrucciones con un script de Python a través de un puerto serie.Comprueba si el puerto en serie está escuchando

Arduino toma el estado de un botón y cuando se presiona, 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 algún motivo (idealmente se ejecutará en segundo plano, por lo que no se puede verificar fácilmente), Arduino esperará para siempre y no estará disponible incluso en un reinicio de 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.

Respuesta

6

Tiene la capacidad limitada de 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 elevar su pin DTR (o debería convencerlo de que lo haga: la documentación de la biblioteca que utiliza para controlar el puerto COM debería decirte cómo).

Luego, en su Arduino, puede verificar su pin DSR (asumiendo el cableado de módem nulo con handshaking, donde el pin PC DTR 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 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 sigue estando bien. Además, su secuencia de comandos puede simplemente perder el mensaje de Arduino debido a errores en la línea serie.

Por esta razón, debe implementar siempre 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 su respuesta lo alcance) intacto).

Volver a enviar el mensaje al menos una vez (suponiendo que se suba DSR) si se produce un tiempo de espera hace que su protocolo sea más confiable.

+0

aplausos compañero. Como punto interesante, google seleccionó su respuesta 3 minutos después de que la publicó. – Hyposaurus

+0

Jeff Atwood twitteó que google es casi el 50% del tráfico a este sitio. (Dang no puede encontrar el tweet, mi google foo no funciona hoy) –

+0

Hola, gracias por la pista de partida, pero desafortunadamente no puedo encontrar más sobre eso para seguir adelante. ¿Puedes proporcionar algún código de ejemplo sobre cómo acceder al pin DSR para Arduino? ¡Aclamaciones! – RngTng

0

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 de desafío/respuesta simple que comprueba periódicamente si alguien está escuchando. (Me gusta la analogía de Ping-Pong de ircd).

1

Arduino no usa la línea DSR ni ninguna otra línea de handshaking, por lo que no puede hacer lo que sugiere.

Cuestiones relacionadas