signal.alarm() 处理程序导致 pyserial 出现问题

Posted

技术标签:

【中文标题】signal.alarm() 处理程序导致 pyserial 出现问题【英文标题】:signal.alarm() handler causing problem with pyserial 【发布时间】:2010-10-27 05:44:56 【问题描述】:

所以我有一个运动传感器连接到通过 USB 与我的 python 应用程序通信的 avr micro。我使用 pyserial 进行通信。在我的脚本中,我有一个无限循环检查来自 avr micro 的数据。在这个循环之前,我用 signal.alarm() 启动一个计时器,它将调用一个函数来结束一个子进程。当此警报响起时,它会中断 pyserial 通信并且程序完全退出。我得到 pyserial read() 被中断的错误。有什么办法可以解决这个问题。任何帮助都会很棒

【问题讨论】:

【参考方案1】:

问题是你的闹钟会中断从串口读取,这根本不是你想要的。

听起来你可能想把它分成两个单独工作的线程。

【讨论】:

不行,用信号打断系统调用是正常的;由应用程序或库重试调用或以其他方式理智地处理它。在 EINTR 上完全失败是一个错误。 这就是我现在正在尝试的。我在子进程上有 read() 函数,现在我遇到了子进程和父进程通信的问题。这只是因为我缺乏对 python 的了解。 所以我知道了管道是什么,我的问题就解决了。感谢所有回复的人【参考方案2】:

您正在使用发送信号的alarm() 和对串行端口进行读写操作的pyserial。当您在这样的设备上读取或写入数据时,如果收到 SIGALRM 信号,则会中断 read()write() 调用,以便处理信号。

由于信号是在用户空间处理的,而读写实际上是由内核处理的,这使得事情变得相当丑陋。这是对信号处理方式的了解,可以追溯到早期的 UNIX 时代。

在 python 中正确处理信号的代码可能如下所示:

import errno
while True:
    try:
        data = read_operation()
    except OSError, e:
        if getattr(e, 'errno', errno.EINTR):
            continue
        raise
    else:
        break

【讨论】:

所以我试图暗示错误处理和调试我看到错误没有被捕获并且脚本仍然退出。我对使用论坛也很陌生,我将如何像你上面那样发布我的代码 要粘贴代码,只需将其粘贴到编辑框中,然后单击 1010 按钮。它会将所有内容缩进 4 个空格并使其看起来很漂亮。

以上是关于signal.alarm() 处理程序导致 pyserial 出现问题的主要内容,如果未能解决你的问题,请参考以下文章

使用Python中的信号超时

如何处理python信号异常?

如何在X毫秒后超时python函数?

PyS60-图库缩略图版本。2

移动开发进入壁垒

多个子进程超时