如何修复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
相关产品推荐
相关产品推荐

