Ошибка Raspberry Pi RPi.GPIO с обратным вызовом под угрозой

Я застрял с функцией wait_for_edge в пакете Python RPi . Я добавил несколько обнаружений событий для падения gpio, и все работает нормально, пока функции обратного вызова не содержат команду, подобную

 os.system("mpc pause") 

Затем скрипт вылетает с сообщением об ошибке: «RunetimeError: Ошибка № 5 в ожидании края». Кто-нибудь знает, что хочет сказать это сообщение об ошибке? Или где я могу посмотреть такие вещи?

Чтобы быть конкретным, этот код работает:

def next(channel):
    print "In next"

GPIO.add_event_detect(buttonnext,GP.FALLING,callback=next,bouncetime=200)

os.system("mpc play")

try:
    GPIO.wait_for_edge(buttonstop, GP.FALLING)
    os.system("mpc stop")
except KeyboardInterrupt:
    GPIO.cleanup()
    os.system("mpc stop")
GPIO.cleanup()

Но этот код не:

def next(channel):
    print "In next"
    os.system("mpc next")

GPIO.add_event_detect(buttonnext,GP.FALLING,callback=next,bouncetime=200)

os.system("mpc play")
try:
    GPIO.wait_for_edge(buttonstop, GP.FALLING)
    os.system("mpc stop")
except KeyboardInterrupt:
    GPIO.cleanup()
    os.system("mpc stop")
GPIO.cleanup()

Вылетает после нажатия кнопки подключенной к порту кнопки стоп.


person Thorsten    schedule 24.02.2014    source источник
comment
Это может показаться глупым, но попробуйте перезапустить Pi. Несколько раз у контактов GPIO были такие странные ошибки для меня, и перезагрузка исправляла это.   -  person DeadChex    schedule 25.02.2014
comment
К сожалению, перезагрузка не помогает. Я заметил, что команда os выполняется до сбоя сценария.   -  person Thorsten    schedule 25.02.2014


Ответы (1)


Супер хакерский, но сразу после вызова os.system, если вы отмените привязку события, а затем сразу же перепривяжете его, похоже, это сработает.

def next(channel):
    print "In next"
    os.system("mpc next")
    GPIO.remove_event_detect(buttonnext)
    GPIO.add_event_detect(buttonnext,GP.FALLING,callback=next,bouncetime=200)
person Hal    schedule 27.05.2016
comment
Рискну сказать, что сам драйвер GPIO глючит. Может быть, кто-то, более разбирающийся в драйвере Python GPIO, может сказать наверняка, но, очевидно, он не работает должным образом между системой и python. Мне нужно было найти какое-то решение для моего монитора батареи GPIO, и я столкнулся именно с этой проблемой. Погуглив и увидев ваш пост, я понял, что это не только я. Итак, я продолжал пытаться, и я (грязно) решил это так. Надеюсь, когда-нибудь мы получим правильное исправление. - person Hal; 26.06.2016
comment
Из моего чтения у меня складывается смутное впечатление, что обратные вызовы выполняются в другом потоке, потоке обратного вызова, поэтому, когда запускается обратный вызов, функция обратного вызова выполняется в потоке, отличном от основного потока. И этот поток обратного вызова используется для всех обратных вызовов, что означает, что за раз может выполняться только один обратный вызов, что, в свою очередь, означает, что обработка в обратном вызове должна быть минимальной. Мне кажется, что os.system("mpc next") не минимален, и это часть проблемы ОП. - person Richard Chambers; 12.02.2021