我的小树莓项目有一个小问题,我已经连接了一个 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/