python - Raspberry Pi 中断 Python(GPIO 库)

标签 python raspberry-pi interrupt gpio

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

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

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

while not GPIO.event_detected(4):

不起作用(如果在这个循环中,则在任何其他方法中调用此方法都不起作用,并且我设置的所有其他按钮也根本不会使用react),如果它是我的默认 while 循环,则它会起作用寿。我在微 Controller 和Python方面都没有太多经验,目前只是业余爱好。如果需要的话我会分享我的整个代码,但我认为它很困惑。

好的,我提供了一个简化的示例,与我的原始代码中发生的情况相同。发生中断后,按钮不会使用react,无论我使用 而不是 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()

最佳答案

您的代码中发生了几件事。我怀疑真正导致问题的原因是您需要先退出中断处理程序,然后才能触发另一个中断回调...但是基于回调的处理程序也存在令人困惑的混合 >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)

关于python - Raspberry Pi 中断 Python(GPIO 库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48597852/

相关文章:

c++ - 在 C++11 中将方法附加到中断例程

c - 中断阻塞读

python - 如何使用Python删除csv文件中的双引号

python - 递归未知深度的查询集列表

python - 如何在 JSON 文件的换行符中写入每个 JSON 对象? (Python)

camera - 如何在 qemu 中使用 USB 摄像头?

linux - 为什么异常处理程序要查找系统调用表?

python - 使用 scapy 发送特定的十六进制数据

macos - 使用 macbook pro 作为树莓派 2 的显示器

linux - 使用 Dashing 与 Raspberry Pi 连接被拒绝