Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Raspberry Pi中断Python(GPIO库)_Python_Raspberry Pi_Interrupt_Gpio - Fatal编程技术网

Raspberry Pi中断Python(GPIO库)

Raspberry Pi中断Python(GPIO库),python,raspberry-pi,interrupt,gpio,Python,Raspberry Pi,Interrupt,Gpio,我的raspberry小项目有点问题,我已经连接了一个LCD屏幕和一堆按钮,从大学的微控制器课程中我学到了中断总是会触发的,不管代码在哪里(但它是用C编写的实际微处理器)。我在python中找到了一个“等价物”,即GPIO库。通常,程序处于无限循环中,等待中断 GPIO.add_event_detect(4, GPIO.RISING, callback=interrupt, bouncetime=200) 我这样设置它们,它们都使用相同的方法,检查按下了哪个按钮,然后运行我想要的另一个方法(例

我的raspberry小项目有点问题,我已经连接了一个LCD屏幕和一堆按钮,从大学的微控制器课程中我学到了中断总是会触发的,不管代码在哪里(但它是用C编写的实际微处理器)。我在python中找到了一个“等价物”,即GPIO库。通常,程序处于无限循环中,等待中断

GPIO.add_event_detect(4, GPIO.RISING, callback=interrupt, bouncetime=200)
我这样设置它们,它们都使用相同的方法,检查按下了哪个按钮,然后运行我想要的另一个方法(例如,一个用于显示时间,另一个用于显示IP地址等)。一件事是,我所做的其中一个方法是在一个无限循环中,另一个按钮按下应该会断开,但从这一点来说,一个方法

while not GPIO.event_detected(4):
不起作用(如果在任何其他循环中调用此方法也不会起作用,并且我设置的所有其他按钮也不会起作用),如果它是我的默认while循环,则它会起作用。我在微控制器和python方面都没有太多经验,这只是目前的爱好。如果需要的话,我会分享我的全部代码,但我认为它相当复杂

好的,我提供了一个简化的示例,与我的原始代码中发生的情况相同。中断发生后,按钮不会做出反应,无论我是否使用
而不是GPIO.event\u detected(19)
GPIO.add\u event\u callback(26,callback=second\u interrupt)


您的代码中有几个方面。我怀疑真正导致问题的原因是,在触发另一个中断回调之前,您需要退出中断处理程序……但基于回调的处理程序和检测到的
GPIO.event\u
方法也存在混淆

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

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

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)

如果没有看到所涉及的实际代码,这个问题很难回答。如果您的代码很长或很复杂,最好的做法是创建一个较小的演示来重现问题。我们称之为“最小、完整、可验证的示例”(minimal,complete,verifiable example)),其目的是让我们更全面地理解您的问题,而不需要我们费力地阅读大量不相关的代码。我编写了一个简单的示例,模仿我的原始代码,这正是sameI不清楚的地方:当插脚19上触发中断时,您希望代码做什么?您已经使用
add\u event\u detect
设置了一个事件回调,但是您也使用了
GPIO.event\u detected
并调用第二个方法。你打算两者都打电话吗?也就是说,我不确定我是否理解您试图实现的逻辑。
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)