UnboundLocalError求助:局部变量'pulse_start'赋值前被引用
排查树莓派超声波液位检测代码的UnboundLocalError问题
首先咱们把这个错误的根源拆解清楚:UnboundLocalError: local variable 'pulse_start' referenced before assignment 意味着你尝试使用pulse_start变量时,它还没被赋值。结合超声波模块的工作逻辑,这个变量本该在while GPIO.input(ECHO) == 0:循环里捕获ECHO引脚低电平的起始时间,但如果这个循环根本没执行(也就是ECHO引脚一直没输出低电平),变量就不会被创建,后续计算环节自然就报错了。
下面给你几个具体的排查和修复方向:
优先检查硬件连接(突发故障最常见原因)
既然之前代码能正常运行,突然报错大概率是硬件接线出了问题:- 重新插拔TRIG(BCM 23)和ECHO(BCM 18)引脚的杜邦线,确保线与树莓派引脚、超声波模块都接触牢固,没有松动或氧化情况。
- 可以把超声波模块换到其他树莓派上测试,或者用万用表测一下模块引脚的电平,确认模块本身没有损坏。
给代码添加超时机制,避免无限等待
你原来的代码是无限等待ECHO引脚的低电平,一旦硬件异常,循环会一直卡着,导致pulse_start永远没机会被赋值。给循环加个超时限制,既能避免报错,还能快速定位问题:# 替换原来捕获低电平的while循环 pulse_start = time.time() timeout = pulse_start + 0.5 # 设置0.5秒超时,可根据实际需求调整 while GPIO.input(ECHO) == 0: pulse_start = time.time() if pulse_start > timeout: print("超时:未检测到ECHO引脚的低电平信号") return None # 返回None或抛出异常,阻止后续代码执行同样,捕获ECHO高电平的循环也要加超时:
pulse_end = time.time() timeout_end = pulse_end + 0.5 while GPIO.input(ECHO) == 1: pulse_end = time.time() if pulse_end > timeout_end: print("超时:未检测到ECHO引脚的高电平信号") return None调整GPIO资源清理的逻辑
你的函数开头就调用了GPIO.cleanup(),如果这个函数被多次调用,可能会导致GPIO引脚状态被意外重置,引发异常。建议把GPIO.cleanup()移到整个程序的末尾(比如程序结束前执行一次),而不是放在函数内部。如果必须在函数里处理,可以先检查GPIO模式是否已设置:def ultrasonicfunction(DistanceOfWaterLevelFromSensor): # 去掉开头的GPIO.cleanup(),改成先检查GPIO模式 if not GPIO.getmode(): GPIO.setmode(GPIO.BCM) TRIG = 23 ECHO = 18 GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) # 后续的触发、检测逻辑不变...
内容的提问来源于stack exchange,提问作者Zack Choon
相关产品推荐
相关产品推荐

