signal.alarm() 处理程序导致 pyserial 问题
我有一个运动传感器,连接到一个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
问题是你的闹钟会打断从串口读取数据的过程,这样可不行。
听起来你可能想把这个任务分成两个线程,让它们各自独立工作。