1

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

4

2 回答 2

0

您正在使用alarm()发送信号的 pyserial 和对串行端口进行读写操作的 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
于 2010-10-27T06:49:35.210 回答
0

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

听起来您可能想将其分解为两个单独工作的线程。

于 2010-10-27T05:48:04.393 回答