【问题标题】:Stop waiting for serial response after 5 seconds in Python在 Python 中 5 秒后停止等待串行响应
【发布时间】:2019-11-28 18:55:03
【问题描述】:

我正在尝试从串行端口获得响应,但有时会出现。这使我的脚本等待永远,因此我必须杀死它。

是否有一种简单的方法可以让我的代码等待 5 秒,如果没有响应则继续执行脚本?

我的代码如下所示:

import serial
ser = serial.Serial('COM3', 9600)

test = '2ho0'

ser.write(str.encode(test))
data = ser.readline()
print(data)

我尝试了this 解决方案,但在打印 5 次 Hello world 后它并没有停止。相反,它会继续写入Hello World,直到我收到runtime error

herehere 上,我尝试了严格的答案,也没有成功。

编辑:我想知道是否有可能有类似的东西:

ser.serialReplyAvailable()

这对我也有用。

感谢您的建议。

【问题讨论】:

  • 我认为 asyncio 模块(特别是 Task 类)是您正在寻找的。这可以提供帮助:stackoverflow.com/questions/34710835/…
  • 我认为 SIGNAL 只能在 unix 上正常工作。由于我在 Windows 上,不幸的是这不起作用。我收到错误signal has no attribute SIGHUP

标签: python serial-port wait


【解决方案1】:

您可以指定读取超时,这将使ser.readline() 在请求的数据可用时立即返回,或者在超时到期之前返回读取的任何内容。检查 pySerial 文档,那里有更多内容。

ser = serial.Serial('COM3', 9600, timeout=5)

【讨论】:

    【解决方案2】:

    如果读取不成功,您可以尝试将 readline 包装到 while 语句中,并在内部设置一个计时器。如果是的话,就摆脱它。

    from time import sleep
    tries = 0
    while tries < 4:
        data = ser.readline()
        if data != None: #Or "", whatever the return data
            break
        sleep(5); tries += 1
    

    【讨论】:

    • 这无济于事,因为脚本卡在data = ser.readline()
    • 啊,所以你没有得到“无”返回,你根本没有得到任何回应。这确实更棘手。我唯一能想到的可能是如果您使用一个新线程,然后在经过一定时间后将其关闭?
    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 2017-05-30
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多