Domanda

Ho uno script Python che scrive i pacchetti di dati ad una scheda Arduino tramite pySerial . A volte durante la scrittura del codice alla scheda pySerial genera un errore di input / output con errno 5.

Alcune ricerche dice che questo indica un errore durante la scrittura nel file che rappresenta il collegamento alla scheda Arduino.

Il codice che invia, invia solo pacchetti singolo byte:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # Check if it's an integer
    elif isinstance(byte, int):
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it
    else: raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

L'errore stampato da questo codice è:

  

Input OS Errore / Output Error Errno 5

C'è qualcosa di sbagliato nel mio codice durante l'invio? Ho bisogno di controllare se la connessione seriale è pronto per inviare qualcosa o ci dovrebbe essere un ritardo dopo l'invio? O ci potrebbe essere un problema con l'hardware o il collegamento con l'hardware?

Modifica : Ho guardato in esecuzione a Linux da pySerial e l'attuazione sta passando solo l'errore al mio codice. Quindi niente nuove intuizioni reali da lì. C'è un buon modo per testare ciò che sta accadendo nel programma?

È stato utile?

Soluzione

Mi dispiace di averla disturbata, ma io sono molto sicuro che l'errore è causato dal arduino reset stessa e quindi la chiusura della connessione al computer.

Altri suggerimenti

L'unico problema che posso vedere subito nel codice è un problema di rientro - modificare il codice come segue:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # else, check if it's an integer
    elif isinstance(byte, int): 
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it 
    else: 
        raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

dubito l'errore viene da questo, ma provo in questo modo e fateci sapere! Si stavano controllando se byte è un int solo nel caso in cui si tratta di un str, in modo che il elif sempre non è riuscito per definizione. Ma penso che se si reale codice di rientro era stato così, si avrebbe ottenuto un SyntaxError, quindi penso che hai appena commesso un errore di invio e il vostro vero problema rimane nascosto.

Se si esegue questo su Windows, non si può avere l'IDE Arduino aperta con un collegamento seriale allo stesso tempo che si esegue lo script Python. Questo getterà lo stesso errore.

Vorrei cercare di offrire alcuni commenti che potrebbero essere utili a voi e altre persone con problemi simili. In primo luogo, cercare di eseguire lo schizzo Arduino con il monitor di serie un paio di volte. È possibile trovare il Serial Monitor Strumenti in menù IDE. È inoltre possibile digitare Ctrl-Shift-M per richiamare il Serial Monitor.

Il Serial Monitor visualizza quanto lo sketch Arduino invia di nuovo voi. Tuttavia, permette anche di digitare i dati che viene inviato al disegno Arduino. In altre parole, si prova e il debug di entrambi i lati del flusso di dati seriali, semplicemente utilizzando il monitor seriale.

Guardate quello che si presenta. Sarà spesso essere molto utile supponendo che il disegno tenta di inviare i dati indietro via Serial.print (). Alcune note. Assolutamente certi che il baud rate impostato all'interno del Serial Monitor corrisponde esattamente la velocità di trasmissione nella vostra schizzo (9600 è una buona scelta in quasi tutti i casi).

La seconda nota è critica. Fanalino di Serial Monitor forza un reset sulla scheda Arduino. Il tuo schizzo ricomincia (sempre). Questa è una buona cosa perché ti dà una corsa fresca ogni volta. Si noti che è possibile forzare un reset, semplicemente impostando la velocità di trasmissione a 9600 (anche se è già 9600). Questo consente di eseguire numerosi test all'interno del monitor in serie senza dover riavviare il Serial Monitor ogni volta.

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