I've got a python program which is reading data from a serial port via the
PySerial module. The two conditions I need to keep in mind are: I don't know how much data will arive, and I don't know when to expect data.
Based on this I have came up with the follow code snipets:
#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
So this code will loop forever getting data off the serial port. We'll get up to 500 characters store the data, then alert the main loop by setting a flag. If no data is present we'll just go back to sleep and wait.
The code is working, but I don't like the 5s timeout. I need it because I don't know how much data to expect, but I don't like that it's waking up every 5 seconds even when no data is present.
Is there any way to check when data becomes available before doing the
read? I'm thinking something like the
select command in Linux.
Just thought I'd note that I found the
inWaiting() method, but really that seems it just change my "sleep" to a poll, so that's not what I want here. I just want to sleep until data comes in, then go get it.