【问题标题】:Raspberry Pi RPi.GPIO error with threated callback带有威胁回调的 Raspberry Pi RPi.GPIO 错误
【发布时间】:2014-02-24 22:29:33
【问题描述】:

我被 Python 包中的 wait_for_edge 函数卡住了 RPi。 我为下降的 gpio 添加了多个事件检测,只要回调函数不包含类似的命令,一切都可以正常工作

 os.system("mpc pause") 

然后脚本崩溃并显示错误消息:“RunetimeError: Error #5 waiting for edge” 有谁知道,这个错误信息想说什么?或者我在哪里可以查到这样的东西?

具体来说,此代码有效:

def next(channel):
    print "In next"

GPIO.add_event_detect(buttonnext,GP.FALLING,callback=next,bouncetime=200)

os.system("mpc play")

try:
    GPIO.wait_for_edge(buttonstop, GP.FALLING)
    os.system("mpc stop")
except KeyboardInterrupt:
    GPIO.cleanup()
    os.system("mpc stop")
GPIO.cleanup()

但是这段代码没有:

def next(channel):
    print "In next"
    os.system("mpc next")

GPIO.add_event_detect(buttonnext,GP.FALLING,callback=next,bouncetime=200)

os.system("mpc play")
try:
    GPIO.wait_for_edge(buttonstop, GP.FALLING)
    os.system("mpc stop")
except KeyboardInterrupt:
    GPIO.cleanup()
    os.system("mpc stop")
GPIO.cleanup()

按下连接到端口 buttonstop 的按钮后崩溃。

【问题讨论】:

  • 这听起来可能很愚蠢,但请尝试重新启动 Pi。几次 GPIO 引脚对我来说都有类似这样的奇怪错误,并且重新启动修复了它
  • 不幸的是,重新启动并没有帮助。我注意到 os 命令是在脚本崩溃之前完成的。

标签: python raspberry-pi gpio


【解决方案1】:

超级 hacky,但是在 os.system 调用之后,如果你取消绑定事件然后重新绑定它,它似乎可以工作。

def next(channel):
    print "In next"
    os.system("mpc next")
    GPIO.remove_event_detect(buttonnext)
    GPIO.add_event_detect(buttonnext,GP.FALLING,callback=next,bouncetime=200)

【讨论】:

  • 我敢说 GPIO 驱动程序本身有问题。也许更精通 Python GPIO 驱动程序的人可以肯定地说,但很明显,它在系统和 python 之间的行为不正常。我必须为我的 GPIO 电池监视器找到某种解决方案,我遇到了这个确切的问题。在谷歌搜索并看到你的帖子之后,我知道这不仅仅是我。所以,继续尝试,我(脏)像这样解决了它。不过,希望有一天我们能得到适当的修复。
  • 从我的阅读中,我得到一个模糊的印象,回调是在不同的线程上执行的,一个回调线程,所以当一个回调被触发时,回调函数是在一个不同的线程上执行的主线程。这个回调线程用于所有回调,这意味着一次只能执行一个回调,这反过来意味着回调中的处理应该是最小的。在我看来,os.system("mpc next") 不是最小的,这是 OP 问题的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多