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

1 投票
2 回答
784 浏览
提问于 2025-04-16 06:09

我有一个运动传感器,连接到一个AVR微控制器上,它通过USB和我的Python应用程序进行通信。我使用pyserial来进行这个通信。在我的脚本中,有一个无限循环在检查来自AVR微控制器的数据。在这个循环之前,我用signal.alarm()启动了一个定时器,这个定时器会调用一个函数来结束一个子进程。当这个定时器响起时,它会打断pyserial的通信,导致程序完全退出。我收到一个错误提示,说明pyserial的read()被打断了。有没有办法解决这个问题?任何帮助都非常感谢。

2 个回答

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
0

问题是你的闹钟会打断从串口读取数据的过程,这样可不行。

听起来你可能想把这个任务分成两个线程,让它们各自独立工作。

撰写回答