【问题标题】:Python: PySerial disconnecting from device randomlyPython:PySerial 随机断开与设备的连接
【发布时间】: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(),那么这应该不是问题,但如果您发送命令,则情况不同,正如我所说的很难回答,因为它可能是硬件问题。

标签: python pyserial stability


【解决方案1】:

在不经常拨打inWaiting() 之后,问题减少了很多。无论如何,我保留了重新连接部分以确保我的程序永远不会失败。感谢“Kobi K”提出问题的可能原因。

【讨论】:

    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 2017-11-21
    • 2013-08-14
    • 1970-01-01
    • 2014-07-17
    • 2017-04-29
    • 2014-10-13
    • 2019-04-16
    相关资源
    最近更新 更多