运行时警告: 使用GPIO.setup和GPIO.cleanup时无法与KeyboardInterrupt一起使用

8

我在使用树莓派编程时遇到了问题。 由于我刚开始接触Python,所以需要一些帮助。

这是我的代码:

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

led1=22
led2=17

GPIO.setup(led1, GPIO.OUT)
GPIO.setup(led2, GPIO.OUT)

def blink():
    GPIO.output(led1, 1)
    time.sleep(1)
    GPIO.output(led1, 0)

    GPIO.output(led2, 1)
    time.sleep(1)
    GPIO.output(led2, 0)

while(blink):
    blink()

try:
    main()
except KeyboardInterrupt:
    GPIO.cleanup()

当我运行程序时,控制台会出现以下错误信息:

运行时警告:此通道已在使用中,但仍将继续。使用 GPIO.setwarnings(False) 可以禁用警告。GPIO.setup(led1, GPIO.OUT) 和:

运行时警告:此通道已在使用中,但仍将继续。使用 GPIO.setwarnings(False) 可以禁用警告。GPIO.setup(led2, GPIO.OUT)

如果我理解正确,命令 GPIO.cleanup() 应该重置 GPIO 端口的所有引脚并关闭 LED 灯。
但事实上,其中一个 LED 灯仍然亮着。
如何修改我的代码以解决这个问题?

2
不好意思,请问标题和问题有什么关系吗?这些都是运行时警告,您没有显示任何语法错误,因此语法显然是正确的。 - Jan Hudec
你说得对,我现在注意到了,很抱歉出错了...当我开始写的时候,我有语法错误,但我已经解决了,只是因为疏忽没有改过来。 - Denis0189
3个回答

10

这里有一些帮助,让你有效地分离函数并使它们更加通用。虽然我提供了一个可工作的Python脚本,但我没有在我的树莓派上测试它,但我认为它会工作 -- 无论如何,如果有任何问题,请告诉我!

import RPi.GPIO as GPIO
import time

# Module level constants
LED1 = 22
LED2 = 17

# Sets up pins as outputs
def setup(*leds):
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    for led in leds:
        GPIO.setup(led, GPIO.OUT)
        GPIO.output(led, GPIO.LOW)

# Turn on and off the leds
def blink(*leds):
    # Blink all leds passed
    for led in leds:
        GPIO.output(led, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(led, GPIO.LOW)

if __name__ == '__main__':
    # Setup leds
    setup(LED1, LED2)
    # Run blinking forever
    try:
        while True:
            blink(LED1, LED2)
    # Stop on Ctrl+C and clean up
    except KeyboardInterrupt:
        GPIO.cleanup()

友情建议:

还有一个专门的 Raspberry Pi StackExchange 网站:https://raspberrypi.stackexchange.com/


谢谢您提供这段代码,我会尽快尝试并努力学习填补我的不足。如果我有更多问题,我会在树莓派交流社区里提问。 - Denis0189
我很高兴能够帮助 :) - Peter Varo

9

你似乎没有在问题中包含main。但是如果程序以除了KeyboardInterrupt之外的某些原因退出,该问题可能会发生。最好在finally块中释放资源。

try:
    main()
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()

这是最好的、最简洁的答案 - 谢谢约翰! - Robin Hartland

2
你正在调用 main() 函数,但它并没有声明(定义),你使用了 while(blink)。所以你需要删除 "main()" 并将 "Try" 放在你的主函数之前,即 while(blink) 循环。别忘了适当的制表符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接