【发布时间】:2016-10-05 13:53:01
【问题描述】:
我有一个使用 PySerial 运行数据采集的进程。它现在工作正常,但我必须做一件奇怪的事情才能让它连续工作,我不确定这是否正常,所以我问了这个问题。
会发生什么:看起来连接有时会断开!大约每 30-60 分钟一次,误差线很大(可能会持续几个小时并没问题,但有时会经常发生)。
我的问题:这是标准吗?
我的临时解决方案:我写了一个简单的“重新打开”函数,如下所示:
def ReopenDevice(devObject):
try:
devObject.close()
devObject.open()
except Exception as e:
print("Error while trying to connect to device " + devObject.port + ". The error says: " + str(e))
time.sleep(2)
我的做法是,如果数据拉取失败2分钟,我用这个功能重新打开设备,它继续正常工作,没有问题。
我的程序模型:它是一个 GUI 程序,用户单击“开始”之类的东西,该按钮会做一些准备工作并通过multiprocessing.Process() 运行一个函数,该函数的开头是:
devObj = serial.Serial()
#... other params
devObj.open()
然后该函数运行一个 while 循环,该循环通过以下方式不断轮询数据:
bytesToRead = devObj.inWaiting()
if bytesToRead != 0:
buffer = decodeString(devObj.read(bytesToRead))
#process buffer and push it to a list...
我知道问题发生的方式是,devObj.inWaiting() 一直返回零……无论设备上有多少数据!
这种行为是预期的吗?无论是否发生,都应始终考虑它?
【问题讨论】:
-
真的很难说是什么问题,因为它可能与配置问题(波特率/奇偶校验)甚至与设备本身有关,一个问题是您的循环是否处于睡眠状态?也许你正在用请求“淹没”设备,它可以处理它。
-
@KobiK 实际上没有。我不在循环中
sleep。因为我想尽快拉取所有可用的数据,而设备只排队 16KB 的数据。 -
如果只是
inWaiting(),那么这应该不是问题,但如果您发送命令,则情况不同,正如我所说的很难回答,因为它可能是硬件问题。