使用GPIO.setup和GPIO.cleanup的RuntimeWarning不能与KeyboardInterrupt一起使用

Den*_*189 7 python keyboardinterrupt raspberry-pi

我的代码使用raspberry pi时遇到问题.我刚开始使用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()
Run Code Online (Sandbox Code Playgroud)

当我运行此错误时出现在控制台中:

RuntimeWarning:此频道已在使用中,无论如何都在继续.使用GPIO.setwarnings(False)禁用警告.GPIO.setup(led1,GPIO.OUT)和:

RuntimeWarning:此频道已在使用中,无论如何都在继续.使用GPIO.setwarnings(False)禁用警告.GPIO.setup(led2,GPIO.OUT)

如果我理解正确,该命令GPIO.cleanup()应重置GPIO端口的所有引脚并关闭LED.

但事实并非如此,其中一位领导仍然存在.

如何更改我的代码来解决此问题?

Pet*_*aro 8

这里有一点帮助,如何有效地分离你的功能,并使它们更通用.虽然这是我提供的一个有效的Python脚本,但我没有在我的raspi上测试它,但我认为它会起作用 - 无论如何,让我知道是否有任何问题!

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()
Run Code Online (Sandbox Code Playgroud)

友好的推荐:

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


Joh*_*ooy 8

您似乎没有包含main在您的问题中.但是,如果程序由于某些原因而退出,则可能会出现此问题KeyboardInterrupt.最好在finally块中释放资源

try:
    main()
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()
Run Code Online (Sandbox Code Playgroud)