树莓派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
相关产品推荐
相关产品推荐

