Domanda

Ho un Arduino che invia e riceve istruzioni con uno script Python tramite una porta seriale.

Arduino prende uno stato pulsante e quando viene premuto, invierà un messaggio tramite la porta seriale a uno script Python e attende una risposta. (tramite Serial.available () ). Funziona abbastanza bene.

Tuttavia, se lo script Python si è arrestato in modo anomalo per qualsiasi motivo (idealmente verrà eseguito in background, quindi non può essere facilmente controllato), Arduino attenderà per sempre e non sarà disponibile nemmeno al riavvio dello script.

C'è un modo per il mio Arduino di verificare se c'è qualcosa in ascolto sulla porta seriale? (e avvisami con luci lampeggianti, ecc. in caso contrario) o non funziona in modo seriale? Nel peggiore dei casi immagino di poter usare un timeout, anche se non è l'ideale.

È stato utile?

Soluzione

Hai una capacità limitata di rilevare se c'è qualcosa in ascolto dall'altra parte usando i pin DSR / DTR.

Quando apri la porta seriale sul computer su cui girano gli script, dovrebbe sollevare il suo pin DTR (o dovresti essere in grado di convincerlo a farlo: la documentazione della libreria che usi per guidare la porta COM dovrebbe dire tu come).

Quindi, sul tuo Arduino, puoi controllare il suo pin DSR (supponendo un cablaggio null-modem con handshaking, dove il pin DTR del PC è cablato su DSR + CD su Arduino) a intervalli regolari e gestire il "nessuno connesso" scenario in qualsiasi modo tu ritenga opportuno.

Un problema con questo approccio è che lo script del tuo PC potrebbe non chiudere la porta seriale quando si blocca / smette di rispondere, lasciando il pin DTR abilitato come se tutto fosse ancora OK. Inoltre, lo script potrebbe semplicemente mancare il messaggio di Arduino a causa di errori sulla linea seriale.

Per questo motivo, dovresti sempre implementare un timeout nelle tue routine di ricezione: anche se c'è una festa in ascolto dall'altra parte, non c'è garanzia che abbia ricevuto il tuo messaggio (o che il suo la risposta ti raggiungerà intatta).

Reinviare il messaggio almeno una volta (supponendo che il DSR sia aumentato) se si verifica un timeout rende il protocollo più affidabile.

Altri suggerimenti

Arduino non utilizza la linea DSR o qualsiasi altra linea di handshaking, quindi non puoi fare ciò che suggerisci.

Sono d'accordo con mdb che i timeout sono necessari, ma aggiungerei anche che potresti voler implementare un semplice sistema challenge / response che controlla periodicamente se qualcuno sta ascoltando. (Mi piace l'analogia di Ping-Pong di Ircd).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top