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

树莓派GPIO键盘中断后限位开关无响应问题排查

问题描述

在运行Raspbian OS的树莓派4上测试限位开关时,每次通过键盘中断(Ctrl+C)终止脚本后,GPIO引脚便不再响应限位开关。先后尝试引脚16、20、21,初始均能正常检测状态,但中断后再次运行脚本就无法读取输入。

测试代码

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

SWITCH_PIN = 16
DEBOUNCE_TIME_MS = 200

GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

switch_state = GPIO.input(SWITCH_PIN)
prev_switch_state = switch_state

def button_callback(channel):
    global switch_state
    switch_state = GPIO.input(SWITCH_PIN)

GPIO.add_event_detect(SWITCH_PIN, GPIO.BOTH, callback=button_callback, bouncetime=DEBOUNCE_TIME_MS)

try:
    while True:
        if switch_state != prev_switch_state:
            if switch_state == GPIO.HIGH:
                print("The limit switch: TOUCHED -> UNTOUCHED")
            else:
                print("The limit switch: UNTOUCHED -> TOUCHED")
            
            prev_switch_state = switch_state

        if switch_state == GPIO.HIGH:
            print("The limit switch: UNTOUCHED")
        else:
            print("The limit switch: TOUCHED")

except KeyboardInterrupt:
    GPIO.cleanup()

已执行操作

  • 运行sudo apt update
  • 因边缘检测问题从旧GPIO包切换为rpi-lgpio包
  • 接线:树莓派GND接Jaycar产250V 5A带杆SPDT微动开关NO端,GPIO引脚接COM端
  • 脚本原本可正常运行数小时
  • 已测试两个限位开关及全新树莓派4

解决办法
  1. 优化GPIO清理流程
    在键盘中断的处理块中,先移除事件检测再执行引脚清理,避免事件残留导致的引脚锁定:

    except KeyboardInterrupt:
        GPIO.remove_event_detect(SWITCH_PIN)
        GPIO.cleanup()
    
  2. 更新rpi-lgpio到最新版本
    执行命令修复可能存在的包版本bug:

    sudo apt update && sudo apt upgrade -y rpi-lgpio
    
  3. 简化脚本排除事件检测干扰
    使用无事件检测的基础脚本测试引脚功能,确认硬件和引脚本身正常:

    import RPi.GPIO as GPIO
    import time
    
    GPIO.setmode(GPIO.BCM)
    SWITCH_PIN = 16
    GPIO.setup(SWITCH_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
    try:
        while True:
            current_state = GPIO.input(SWITCH_PIN)
            print("限位开关:未触发" if current_state == GPIO.HIGH else "限位开关:已触发")
            time.sleep(0.1)
    except KeyboardInterrupt:
        GPIO.cleanup()
    
  4. 禁用GPIO警告(可选)
    在脚本开头添加GPIO.setwarnings(False),避免因引脚状态残留导致的警告干扰:

    import RPi.GPIO as GPIO
    
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    # 后续代码不变
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:53:25