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

树莓派4+Python11读取HB100雷达下降沿报错RuntimeError求助

问题:HB100雷达下降沿检测出现RuntimeError: Error waiting for edge

我通过LM358放大模块采集HB100多普勒雷达的下降沿信号,此前运行状态良好,突然出现RuntimeError: Error waiting for edge错误。已尝试更换雷达及放大模块、切换GPIO引脚,问题仍未解决。设备为树莓派4,Python版本3.11,相关代码如下:

import RPi.GPIO as GPIO
import time

GPIO.cleanup()

AMPLIFICADOR_INPUT_PIN = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(AMPLIFICADOR_INPUT_PIN, GPIO.IN)

MAX_PULSE_COUNT = 10
MOTION_SENSITIVITY = 10

def count_frequency(GPIO_pin, max_pulse_count=10, ms_timeout=50):
    start_time = time.time()
    pulse_count = 0

    for count in range(max_pulse_count):

        edge_detected = GPIO.wait_for_edge(GPIO_pin, GPIO.FALLING, timeout=ms_timeout)

        if edge_detected is not None:
            pulse_count += 1

    duration = time.time() - start_time 
    frequency = pulse_count / duration
    
    return frequency

while True:
    doppler_freq = count_frequency(AMPLIFICADOR_INPUT_PIN)
    speed = doppler_freq / float (31.36)
    print (speed)

    if (speed>2):
        print ('high Speed'+ "Your speed="+ str(speed) +'Mph')        

    if doppler_freq < MOTION_SENSITIVITY:
        print("No motion was detected")

    else:
        print("Motion was detected, Doppler frequency was: {0}".format(doppler_freq))
        
GPIO.cleanup()

解决方案
  • 修复GPIO资源泄漏
    原代码中while True是死循环,末尾的GPIO.cleanup()永远无法执行,长期运行会导致GPIO资源占用异常。需添加中断捕获逻辑,确保程序退出时能正确释放GPIO。

  • 增加边缘检测异常处理
    wait_for_edge在GPIO资源被意外释放或异常超时会抛出RuntimeError,需在函数内捕获该异常,避免程序直接崩溃,同时返回合理的默认值保证后续逻辑正常运行。

  • 优化GPIO输入配置
    HB100的输出信号可能需要上拉/下拉电阻稳定电平,可在GPIO.setup时添加pull_up_down参数,根据实际信号电平选择GPIO.PUD_UP或GPIO.PUD_DOWN。

  • 降低CPU占用
    无延迟的死循环会导致CPU占用过高,影响GPIO检测稳定性,在循环末尾添加短暂延迟。


修改后的代码
import RPi.GPIO as GPIO
import time

AMPLIFICADOR_INPUT_PIN = 23
MAX_PULSE_COUNT = 10
MOTION_SENSITIVITY = 10

def count_frequency(GPIO_pin, max_pulse_count=10, ms_timeout=50):
    start_time = time.time()
    pulse_count = 0

    for count in range(max_pulse_count):
        try:
            edge_detected = GPIO.wait_for_edge(GPIO_pin, GPIO.FALLING, timeout=ms_timeout)
            if edge_detected is not None:
                pulse_count += 1
        except RuntimeError:
            # 捕获边缘检测异常,重置计数避免后续计算错误
            pulse_count = 0
            break

    duration = time.time() - start_time 
    # 避免除以0的情况
    if duration <= 0:
        return 0.0
    frequency = pulse_count / duration
    
    return frequency

if __name__ == "__main__":
    try:
        GPIO.setmode(GPIO.BCM)
        # 根据实际信号调整上拉/下拉,这里以上拉为例
        GPIO.setup(AMPLIFICADOR_INPUT_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

        while True:
            doppler_freq = count_frequency(AMPLIFICADOR_INPUT_PIN)
            speed = doppler_freq / 31.36
            print(f"Speed: {speed:.2f} Mph")

            if speed > 2:
                print(f"High Speed - Your speed: {speed:.2f} Mph")        

            if doppler_freq < MOTION_SENSITIVITY:
                print("No motion was detected")
            else:
                print(f"Motion was detected, Doppler frequency was: {doppler_freq:.2f}")
            
            # 增加延迟降低CPU占用
            time.sleep(0.1)
    except KeyboardInterrupt:
        # 捕获Ctrl+C退出信号,清理GPIO
        print("\nExiting program...")
    finally:
        GPIO.cleanup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:13:51