我有一个python程序,我想在后台运行(在Raspberry Pi上)等待GPIO输入然后执行操作并继续等待输入,直到进程被终止。
实现这一目标的最有效方法是什么。我的理解是,使用while true并不是那么有效。理想情况下它会使用中断 - 我可以使用GPIO.wait_for_edge - 但这需要在某个循环中或在处理程序完成后继续操作的方式。
由于
答案 0 :(得分:1)
根据:http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio GPIO.wait_for_edge(23,GPIO.FALLING)将使用中断而不是轮询等待引脚23上的转换。它只会在触发时继续。您可以将它包含在try:/中,除了KeyboardInterrupt以捕获ctrl-c。
如果要继续处理,则应为中断注册回调函数。请参阅:http://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/
def callback(channel):
do something here
GPIO.add_event_detect(channel, GPIO.RISING, callback=my_callback)
continue your program here, likely in some sort of state machine
答案 1 :(得分:1)
据我所知,当你说“正确使用”时,你指的是民意调查, 这是在某个时间间隔检查gpio状态以进行检测 改变,以牺牲一些处理时间为代价。
避免轮询的一种替代方法(来自docs)是wait_for_edge():
wait_for_edge()函数用于阻止程序的执行 直到检测到边缘。
这似乎是你在找什么;该计划将暂停 使用epool() IIUC执行。
现在假设你意味着你不想使用GPIO.wait_for_edge() 因为您不希望在处理时丢失GPIO状态更改 事件,你需要使用线程。一种可能的解决方案是投入 Queue中的事件和设置:
while True: queue.put(GPIO.wait_for_edge(...))
。Queue.get()
。