У меня есть программа Python, которая читает данные из последовательного порта через модуль PySerial. Мне нужно помнить о двух условиях: я не знаю, сколько данных поступит, и я не знаю, когда ожидать данные.
Исходя из этого, я придумал следующие фрагменты кода:
#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 the first data we recieved, store it
self.data = tdata
else: #if it not the first, append the data
self.data += tdata
self.flag_got_data = 1
Таким образом, этот код будет зацикливаться на получение данных от последовательного порта. Мы получим до 500 символов для хранения данных, а затем оповестим основной цикл, установив флаг. Если данных нет, мы просто вернемся спать и будем ждать.
Код работает, но мне не нравится время ожидания 5 с. Мне это нужно, потому что я не знаю, сколько данных ожидать, но мне не нравится, что он просыпается каждые 5 секунд, даже если данных нет.
Есть ли способ проверить, когда данные становятся доступными, прежде чем read
? Я думаю, что-то вроде команды select
в Linux.
Примечание: я нашел метод inWaiting()
, но на самом деле кажется, что он просто меняет мой "сон" на опрос, так что это не то, что я хочу. Я просто хочу поспать, пока данные не придут, а потом иди за ними.