我有一个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个字符的数据,然后通过设置标志向主循环发出警报。如果没有数据存在,我们将返回睡眠并等待。
代码正在工作,但我不喜欢5秒的超时。我需要它是因为我不知道要期望多少数据,但我不喜欢它即使没有数据时也每隔5秒就会唤醒。
在进行read
操作之前有没有任何方法检查何时可用数据?我在考虑像Linux中的select
命令这样的东西。
注意:我找到了inWaiting()
方法,但实际上那似乎只是将我的“睡眠”更改为轮询,所以这不是我想要的。我只想睡觉,直到有数据进来,然后去取它。
data_left
变得非常不可靠(一个19个字符的字符串循环为3,然后10,然后6个“bank”进来)。所以我仍然对此不满意,但它更接近我所考虑的。等待数据,然后读取数据,然后再次休眠。 - MikeinterCharTimeout
,这样可以让您检测接收器何时停止看到任何新字节。 - TJD