【发布时间】: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