Ho un programma Python che sta leggendo i dati da una porta seriale tramite il modulo PySerial
. Le due condizioni che devo tenere a mente sono: non so quanti dati saranno disponibili e non so quando prevedere i dati.Utilizzando PySerial è possibile attendere i dati?
Sulla base di questo ho si avvicinò con le snipets CODICE:
#Code from main loop, spawning thread and waiting for data
s = serial.Serial(5, timeout=5) # Open COM5, 5 second timeout
s.baudrate = 19200
#Code from thread reading serial data
while 1:
tdata = s.read(500) # Read 500 characters or 5 seconds
if(tdata.__len__() > 0): #If we got data
if(self.flag_got_data is 0): #If it's the first data we recieved, store it
self.data = tdata
else: #if it's not the first, append the data
self.data += tdata
self.flag_got_data = 1
Quindi questo codice esegue un loop infinito ottenere i dati fuori la porta seriale. Otterremo fino a 500 caratteri per memorizzare i dati, quindi avvisare il ciclo principale impostando un flag. Se non ci sono dati, torneremo a dormire e aspettiamo.
Il codice funziona ma non mi piace il timeout 5s. Ne ho bisogno perché non so quanti dati aspettarsi, ma non mi piace che si svegli ogni 5 secondi anche quando non ci sono dati presenti.
C'è un modo per verificare quando i dati diventano disponibili prima di effettuare il read
? Sto pensando a qualcosa come il comando select
in Linux.
EDIT:
Ho pensato di notare che ho trovato il metodo inWaiting()
, ma in realtà sembra che solo cambiare la mia "sonno" per un sondaggio, in modo che non è quello che voglio qui. Voglio solo dormire finché i dati non arrivano, quindi vai a prenderlo.
'time.sleep (1)' sembra un trucco piuttosto brutto che aggiunge un po 'di ritardo nel far uscire i tuoi dati. – TJD
@TJD - Non ci sono argomenti, sembra che funzioni anche senza sleep, ma 'data_left' diventa molto inaffidabile (una stringa di 19 caratteri esegue il loop come 3, quindi 10, poi 6" bank "entrano). Quindi non sono ancora soddisfatto, ma è più vicino a ciò a cui stavo pensando. Dormire fino a quando i dati, quindi leggere i dati, quindi tornare a dormire. – Mike
Non vedo come sia "inaffidabile". È esattamente come arrivano i byte mentre li stai leggendo.Si potrebbe voler usare 'interCharTimeout', che consente di rilevare quando il ricevitore ha smesso di vedere nuovi byte. – TJD