【问题标题】:Shared variable with GPIO callback function with Raspberry带有 GPIO 回调函数的共享变量与 Raspberry
【发布时间】:2015-04-23 13:46:12
【问题描述】:

我在 python 中编写了这个简单的测试程序来检查当我按下树莓派中的按钮时是否发生了什么:

import RPi.GPIO as GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.IN, pull_up_down = GPIO.PUD_UP)

testVar=0

def my_callback(channel):
  print "Pressed!"
  testVar= 32

GPIO.add_event_detect(24, GPIO.FALLING, callback=my_callback, bouncetime=200)
while True:
    print str(testVar)
    sleep(0.5)

我只读取 0 个值,当我按下按钮时,我看到“按下!”但变量没有改变。据我了解,原因是因为回调函数是作为新线程午餐的,当然变量无法正确设置。有没有办法以某种方式将共享 var 发送到回调函数?

非常感谢任何好的建议。

【问题讨论】:

    标签: python raspberry-pi gpio raspberry-pi2


    【解决方案1】:

    您好,只是找到解决方案,我发布它也许它可能有用。 使用 global 这个词使它起作用。

    所以回调函数变成:

    def my_callback(channel):
        global testVar
        print "Pressed!"
        testVar= 32
    

    【讨论】:

      【解决方案2】:

      我有同样的问题让我发疯......将变量设置为global 是解决方案。解释是根据this 全局变量教程,只要变量没有标记为全局变量,它就会保持在函数的本地范围内。在函数内部使变量成为全局变量有两个后果:

      a) 如果全局变量 x 不存在:global x = 0 创建一个新的全局变量 x 并将其值设置为 0

      b) 如果全局变量 x 已经存在:global x = 0 将现有全局变量的值更改为 0(与不使用 global 关键字的 x = 0 相反,后者会将值 0 分配给局部范围的变量)。

      所以 b 是在回调函数中改变全局变量值的解决方案。

      【讨论】:

      • 答案是正确的,但是OP已经找到了这个解决方案,请避免在未来已经发布的解决方案中添加答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 2016-04-06
      • 1970-01-01
      相关资源
      最近更新 更多