首页 > 解决方案 > 如何确定回调中的python范围

问题描述

在使用 python3 的树莓派上,我想计算传入 I/O 上的脉冲数。为了测试,我整理了一个简单的程序。

import signal
import sys
import RPi.GPIO as GPIO
import time

iTP = 40
ictr=0

def signal_handler(sig, frame):
    GPIO.cleanup()
    print("\nOut of here!")
    sys.exit(0)

def button_pressed_callback(channel):
    global ictr
    ictr+=1

def main():
    print("Here we go!")
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(iTP, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.add_event_detect(iTP, GPIO.FALLING, 
            callback=button_pressed_callback, bouncetime=20)
    
    signal.signal(signal.SIGINT, signal_handler)
    
    sctr=0
    ictr=1
    while 1:
        time.sleep(1)
        print("====")
        while sctr==ictr:
            time.sleep(1)
        print("busy")
        
        while sctr!=ictr:
            time.sleep(2)
        print("Cnt={}".format(sctr))
        ictr=0
        sctr=0
    
main()

我想在回调中收集一个脉冲计数,然后处理main(). 脉冲实际上是在回调中收集的 - 即按ictr预期递增 - 但并不是反映这一点。即使在回调中发生变化(通过打印验证),我也永远不会越过这条线。我尝试了各种全局声明组合,但似乎无法让这个变量在回调和. 非常感谢任何帮助。ictrmain()print("busy")ictrmain()

标签: pythonpython-3.x

解决方案


通过我在各个地方找到的信息,我能够成功创建和使用以下代码。我不清楚为什么我在这里没有相同的范围问题,但这很好用。

import RPi.GPIO as GPIO

class Handle_Interrupts:

    intCnt=0
    
    def __init__(self,ipin, bouncetime):
        self.ipin=ipin
        self.bouncetime=bouncetime

        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(self.ipin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        GPIO.add_event_detect(self.ipin, GPIO.FALLING, 
            self.int__callback, self.bouncetime)

    def int__callback(self,channel):
        self.intCnt+=1
    
    def getCnt(self):
        return(self.intCnt)
        
    def clrCnt(self):
        t=self.intCnt
        self.intCnt=0
        return(t)

推荐阅读