You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Python 3 asyncio程序以读取GPIO26的按键按下事件?

GPIO按键检测asyncio版本故障分析与修复

第一个关键错误:上拉下拉配置不匹配硬件

你的asyncio代码里把GPIO引脚设置成了GPIO.PUD_DOWN,但按键是接GND的——这就导致引脚默认就是低电平,按下按键后电平还是低,完全不会产生**下降沿(FALLING)**信号,自然触发不了回调函数。

而能正常工作的代码用了GPIO.PUD_UP:引脚默认被拉到高电平,按下按键时被GND拉低,电平从高到低的变化刚好符合GPIO.FALLING的触发条件,所以能正常响应。

次要注意点:asyncio与GPIO回调的线程兼容

RPi.GPIO的事件回调是在独立线程里跑的,你现在的回调只是打印,不会有问题,但如果后续要在回调里调用asyncio的异步操作(比如创建任务),得用loop.call_soon_threadsafe()来保证线程安全,避免出问题。

修复后的完整代码

import asyncio
import os
import RPi.GPIO as GPIO
BUTTON_PIN = 26


def button_pushed(_):
    print("button pushed!")

if __name__ == '__main__':
    GPIO.setmode(GPIO.BCM)
    # 修正为PUD_UP,匹配按键接GND的硬件连接
    GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=button_pushed, bouncetime=10)

    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))
    try:
        loop = asyncio.get_event_loop()
        loop.run_forever()
    except (KeyboardInterrupt, SystemExit):
        loop.close()
        GPIO.cleanup()

修复后按下按键,就能正常打印"button pushed!",同时asyncio事件循环可以持续运行,不影响GPIO事件检测。

内容的提问来源于stack exchange,提问作者Daniil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:57:22