Обработчик signal.alarm () вызывает проблему с pyserial - PullRequest
1 голос
/ 27 октября 2010

, поэтому у меня есть датчик движения, подключенный к AVR Micro, который связывается с моим приложением Python через USB. Я использую pyserial, чтобы сделать комм. во время моего скрипта у меня есть бесконечный цикл проверки данных с AVR Micro. перед этим циклом я запускаю таймер с signal.alarm (), который вызовет функцию для завершения подпроцесса. когда этот сигнал тревоги идет, он прерывает pyserial comm, и программа завершается полностью. я получаю ошибку, что pyserial read () прерывается. Есть ли способ обойти эту проблему. любая помощь будет потрясающей

Ответы [ 2 ]

0 голосов
/ 27 октября 2010

Вы используете 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 голосов
/ 27 октября 2010

Проблема в том, что ваш будильник прервет чтение с последовательного порта, что совсем не то, что вы хотите.

Похоже, вы, вероятно, хотите разбить это на два потока, которые работают отдельно.

...