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

Python signal.alarm()处理程序导致pyserial出现问题,python,signals,alarm,pyserial,Python,Signals,Alarm,Pyserial,所以我有一个运动传感器连接到一个avr micro,它通过usb与我的python应用程序通信。我使用pyserial来做通信。在我的脚本期间,我有一个infinate循环来检查来自avr micro的数据。在这个循环之前,我用signal.alarm启动一个计时器,它将调用一个函数来结束一个子进程。当此警报发出时,它会中断PY串行通信,程序将完全退出。我得到的错误是pyserial读取被中断。有没有办法解决这个问题。任何帮助都是非常棒的问题是,您的警报将中断串行端口的读取,这根本不是您想要的

所以我有一个运动传感器连接到一个avr micro,它通过usb与我的python应用程序通信。我使用pyserial来做通信。在我的脚本期间,我有一个infinate循环来检查来自avr micro的数据。在这个循环之前,我用signal.alarm启动一个计时器,它将调用一个函数来结束一个子进程。当此警报发出时,它会中断PY串行通信,程序将完全退出。我得到的错误是pyserial读取被中断。有没有办法解决这个问题。任何帮助都是非常棒的

问题是,您的警报将中断串行端口的读取,这根本不是您想要的

听起来您可能想将其分为两个线程,分别工作。

您使用的是alarm(发送信号)和pyserial(读取和写入串行端口)。当您对这样的设备进行读取或写入时,收到SIGALRM信号,就会中断读取或写入调用,以便处理该信号

由于信号是在用户空间中处理的,而读写实际上是由内核处理的,这使得事情变得相当糟糕。这是信号处理方式的一个众所周知的缺点,可以追溯到UNIX的早期

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

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

不,用信号中断系统调用是正常的;由应用程序或库来重试调用或以其他方式理智地处理调用。在EINTR上完全失败是一个错误。这就是我现在尝试的。我在子进程上有读取功能,现在我遇到了与子进程和父进程通信的问题。这只是因为我缺乏python知识,所以我了解了管道是什么,我的问题就解决了。thanx每个回复的人我都试图实现错误处理,从调试中我看到错误没有被捕获,脚本仍然存在。另外,我对使用论坛非常陌生,我如何像你一样发布我的代码要粘贴我的代码,只需将其粘贴到编辑框中,然后单击1010按钮。它将所有内容缩进4个空格,使其看起来漂亮。