raspberry pi - Python等待输入最有效的方法是什么?



我有一个python程序,我想在后台运行(在Raspberry Pi上),它等待GPIO输入,然后执行一个动作,并继续等待输入,直到进程被杀死。

实现这一目标的最有效方法是什么?我的理解是,使用while true并不是那么有效。理想情况下,它将使用中断——我可以使用GPIO。Wait_for_edge -但这需要在处理程序完成后以某种循环或方式继续操作。

谢谢

根据此: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:/except 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

我明白当你说"using while true"你的意思是轮询,哪一个是在某个时间间隔检查gpio状态来检测更改,以牺牲一些处理时间为代价。

避免轮询(来自文档)的另一种选择是wait_for_edge():

wait_for_edge()函数被设计用来阻止程序的执行直到检测到边缘。

这似乎是你正在寻找的;该计划将暂停使用epool()执行iuc .

现在假设您的意思是不想使用GPIO.wait_for_edge()因为您不希望在处理时丢失GPIO状态更改事件时,您需要使用线程。一个可能的解决方案是放队列中的事件,并设置:

  • 一个线程做while True: queue.put(GPIO.wait_for_edge(...)) .
  • 另一个线程执行Queue.get()

最新更新