Verifique se a porta serial é a escuta
-
10-07-2019 - |
Pergunta
Eu tenho um Arduino enviar e receber instruções com um script Python através de uma porta serial.
O Arduino tem um estado de botão e quando é empurrado, ele irá enviar uma mensagem através da porta serial para um script Python e aguardar uma resposta. (Via Serial.available()
). Ele funciona bem o suficiente.
No entanto, se o script Python caiu por qualquer motivo (idealmente ele será executado em segundo plano, para que ele não pode ser facilmente marcado), o Arduino vai esperar para sempre e não estará disponível até mesmo em um reinício script.
Existe uma maneira para o meu Arduino para verificar se há algo de escuta na porta serial? (E alerta-me com luzes piscando, etc. se não) ou Não é assim de série obras? Pior caso, eu acho que eu poderia usar um tempo limite, apesar de que não é o ideal.
Solução
Você tem uma capacidade limitada para detectar se há algo de escuta do outro lado usando a DSR / DTR dos pinos.
Quando você abre a porta serial na máquina seus scripts é executado, ele deve levantar seu pino DTR (ou você deve ser capaz de convencê-la a fazê-lo: a documentação da biblioteca que você usa para conduzir o porta COM deve dizer -lhe como).
Em seguida, no seu Arduino, você pode verificar seu (fiação de modem nulo assumindo com aperto de mão, onde o pino PC DTR é ligado a + CD DSR no Arduino) pino DSR em intervalos regulares, e lidar com o 'ninguém ligado' cenário de qualquer forma você vê o ajuste.
Um problema com esta abordagem é que seu script PC pode não fechar a porta serial quando ele trava / pára de responder, deixando o pino DTR habilitado como se tudo ainda está OK. Além disso, o script pode simplesmente perder a mensagem do Arduino devido a erros na linha serial.
Por essa razão, você deve sempre implementar um tempo limite em suas recebem rotinas: mesmo se não houver uma escuta festa na outra extremidade, não há garantia de que recebeu a mensagem (ou que o seu resposta que você vai chegar intacto).
Re-enviando a mensagem pelo menos uma vez (assumindo DSR é levantada) se um tempo limite ocorre faz o seu protocolo mais confiável.
Outras dicas
O Arduino não usa a linha DSR ou qualquer outra linha aperto de mão, então você não pode fazer o que você sugere.
Eu concordo com mdb que tempos de espera são necessárias, mas também acrescentar que você pode querer implementar sistema de desafio / resposta simples que verifica periodicamente se alguém está escutando. (I como analogia Ping-Pong de ircd).