【问题标题】:Raspberry Pi Interrupts Python (GPIO Library)Raspberry Pi 中断 Python(GPIO 库)
【发布时间】:2018-02-04 12:25:50
【问题描述】:

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

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

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

while not GPIO.event_detected(4):

不起作用(如果它在此循环中,则在任何其他方法中调用此方法都不起作用,并且我设置的所有其他按钮也根本不会做出反应),如果它是我的默认 while 循环它会寿。我在微控制器和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()

【问题讨论】:

  • 如果没有看到实际涉及的代码,这个问题很难回答。如果您的代码很长或很复杂,最好的做法是创建一个较小的演示来重现问题。我们将其称为“最小、完整、可验证的示例”(stackoverflow.com/help/mcve),其想法是,它为我们提供了一些更全面地理解您的问题的东西,而无需我们费力地处理大量不相关的代码。
  • 我写了一个简单的例子来模仿我的原始代码,它完全一样
  • 我在这里不清楚:当引脚 19 触发中断时,您希望您的代码做什么?您已经使用add_event_detect 设置了一个事件回调,但您还使用了GPIO.event_detected 并调用了第二种方法。你打算两个都打电话吗?也就是说,我不确定我是否理解您尝试实现的逻辑。

标签: python raspberry-pi interrupt gpio


【解决方案1】:

您的代码中有几件事情正在发生。我怀疑真正导致问题的原因是您需要在触发另一个中断回调之前退出中断处理程序......但是基于回调的处理程序 @987654321 也有一个令人困惑的组合@方法。

我认为您可以通过减少对中断配置的操作来简化事情。只需有一个从 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    相关资源
    最近更新 更多