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

时间:2010-10-27 05:44:57

标签: python signals alarm pyserial

所以我有一个运动传感器连接到avr micro,通过usb与我的python应用程序通信。即时通讯使用pyserial来做通讯。在我的脚本中,我有一个infinate循环检查来自avr micro的数据。在这个循环之前,我用signal.alarm()启动一个定时器,它将调用一个函数来结束一个子进程。当这个警报发生时,它会中断pyserial comm并且程序完全退出。我得到pyserial read()被中断的错误。有没有解决这个问题的方法。任何帮助都会很棒

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您正在使用发送信号的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