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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top