我有一个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'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
因此,此代码将永远循环从串行端口获取数据。我们最多可以存储500个字符的数据,然后通过设置标志来警告主循环。如果没有数据存在,我们将重新入睡并等待。
代码正常,但我不喜欢5s超时。我需要它,因为我不知道预期会有多少数据,但我不喜欢它即使没有数据也会每5秒唤醒一次。
在执行read
之前,有没有办法检查数据何时可用?我在想Linux中的select
命令。
注意:我找到了inWaiting()
方法,但实际上它似乎只是将我的“睡眠”改为民意调查,所以这不是我想要的。我只想睡觉直到数据进入,然后去拿它。
答案 0 :(得分:18)
好的,我实际上得到了一些我喜欢的东西。使用read()
没有超时和inWaiting()
方法的组合:
#Modified code from main loop:
s = serial.Serial(5)
#Modified code from thread reading the serial port
while 1:
tdata = s.read() # Wait forever for anything
time.sleep(1) # Sleep (or inWaiting() doesn't give the correct value)
data_left = s.inWaiting() # Get the number of characters ready to be read
tdata += s.read(data_left) # Do the read and combine it with the first character
... #Rest of the code
这似乎给出了我想要的结果,我想这种类型的功能在Python中不作为单个方法存在
答案 1 :(得分:12)
您可以设置timeout = None
,然后read
调用将阻塞,直到请求的字节数为止。如果您想等到数据到达,只需执行read(1)
超时None
。如果要在不阻塞的情况下检查数据,请执行超时为零的read(1)
,并检查它是否返回任何数据。
答案 2 :(得分:0)
def cmd(cmd,serial):
out='';prev='101001011'
serial.flushInput();serial.flushOutput()
serial.write(cmd+'\r');
while True:
out+= str(serial.read(1))
if prev == out: return out
prev=out
return out
这样称呼:
cmd('ATZ',serial.Serial('/dev/ttyUSB0', timeout=1, baudrate=115000))