Raspberry Pi中断Python(GPIO库)

时间:2018-02-03 13:26:34

标签: python raspberry-pi interrupt gpio

我的小树莓项目有点问题,我已经连接了一个液晶显示屏和一串按钮,从我的大学课程中了解到微控制器我已经了解到中断始终会触发,无论如何代码所在的位置(但它是用C编写的实际微处理器)。我找到了一个等同的"在python中,GPIO库。通常程序处于无限循环中等待中断。

GPIO.add_event_detect(4, GPIO.RISING, callback=interrupt, bouncetime=200)

我以这种方式设置它们,它们都采用相同的方法并检查按下了哪个按钮并运行我想要的另一种方法(例如,一个用于显示时间,另一个用于IP地址等)。问题是,我所做的其中一种方法是在无限循环中按下另一个按钮应该打破,但从这一点开始一个方法

while not GPIO.event_detected(4):

不起作用(在任何其他方法中调用此方法,如果它在此循环中,并且我设置的所有其他按钮都不会起作用),如果它是我的默认值而循环它做了。我在微控制器和python方面都没有多少经验,这只是目前的业余爱好。如果需要我会分享我的整个代码,但我觉得它很纠结。

好的我提供了一个简化的例子,同样的事情发生在原始代码中。发生中断后,按钮不会响应,如果我使用while not GPIO.event_detected(19)GPIO.add_event_callback(26, callback=second_interrupt)则无关紧要。

import RPi.GPIO as GPIO
import time


GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # Button 1
GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # Button 2


def interrupt(channel):
    print "interrupt"
    if channel == 26:
        print "in loop"
        GPIO.add_event_callback(26, callback=second_interrupt)  #Trying to use this won't trigger second interrupt
        while not GPIO.event_detected(19):                      #and this wont ever trigger
            time.sleep(1)
            print "inside loop"


def second_interrupt():
    print "second interrupt"


GPIO.add_event_detect(26, GPIO.RISING, callback=interrupt, bouncetime=200)  # add rising edge detection on a channel
GPIO.add_event_detect(19, GPIO.RISING, callback=interrupt, bouncetime=200)  # add rising edge detection on a channel


while (True):
    time.sleep(1)
    if GPIO.event_detected(19):         #this version works if I wont enter an interrupt first
        second_interrupt()

1 个答案:

答案 0 :(得分:1)

您的代码中发生了一些事情。我怀疑造成这个问题的真正原因是你需要在触发另一个中断回调之前退出中断处理程序......但是还有一个令人困惑的混合基于回调的处理程序 GPIO.event_detected方法。

我认为您可以通过减少对中断配置的操作来简化操作。只需要一个从0开始的状态变量,在第一个中断时将其增加到1,所以下次调用interrupt方法时你知道它是第二个中断。无需尝试设置这样的多个处理程序。

请记住,我实际上并不知道你要做什么......我想象这样的事情:

import RPi.GPIO as GPIO
import time

state = 0

GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP)


def interrupt_handler(channel):
    global state

    print("interrupt handler")

    if channel == 19:
        if state == 1:
            state = 0
            print("state reset by event on pin 19")
    elif channel == 26:
        if state == 0:
            state = 1
            print("state set by event on pin 26")


GPIO.add_event_detect(26, GPIO.RISING,
                      callback=interrupt_handler,
                      bouncetime=200)

GPIO.add_event_detect(19, GPIO.RISING,
                      callback=interrupt_handler,
                      bouncetime=200)


while (True):
    time.sleep(0)