与Raspberry一起使用GPIO回调函数的共享变量

时间:2015-04-23 13:46:12

标签: python raspberry-pi gpio raspberry-pi2

我在python中编写了这个简单的测试程序,以检查当我在Raspberry Pi中按下按钮时是否发生了某些事情:

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发送到回调函数?

非常感谢任何好的建议。

2 个答案:

答案 0 :(得分:4)

您好,只是找到解决方案,我发布它也许它可能有用。 使用全球一词使其有效。

因此回调函数变为:

out = squeeze(sum(bsxfun(@and,I,permute(I,[1 3 2])),1));
out(1:size(out,1)+1:end)=0;

答案 1 :(得分:1)

我有一个让我抓狂的问题……将变量设置为global是解决方案。根据{{​​3}}关于全局变量的教程的解释,只要未将变量标记为全局变量,变量就始终在函数的局部作用域内。使变量在函数内部全局具有两个结果:

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

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

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