Python3.x pyserial继承Serial类触发栈溢出致命错误求助
解决串口重连时的栈溢出问题
你碰到的这个栈溢出致命错误,核心原因是用递归方式重新调用endless()函数。Python的调用栈有默认深度限制(一般在1000左右),每触发一次SerialException就会新增一层函数调用栈,几百次之后自然就把栈空间耗光了。
解决方法很简单,把递归改成循环结构,这样整个重连逻辑都会在同一个函数栈帧里执行,不会累积栈层级:
import serial import time def endless(): while True: try: with serialObjectDerivedFromserial.Serial("/dev/tty/bsp") as bsp: # 这里写你原本要执行的操作 pass except serial.SerialException: # 通知用户设备未连接 print("设备未连接,10秒后重试...") time.sleep(10) except Exception: # 处理其他未知错误 print("发生未知错误...") # 可以根据需要选择是否退出循环或继续重试 break
修改关键点说明:
- 用
while True无限循环替代递归调用,每次异常处理完直接回到循环顶部,重新尝试连接 - 把原有的
try-except逻辑包裹在循环内部,保持原有的异常处理行为,但避免了栈空间的持续占用 - 把原代码的裸
except:改成except Exception:(裸except:会捕获包括KeyboardInterrupt在内的所有异常,可能导致无法正常手动终止程序)
这样修改后,不管重连多少次,都不会再出现栈溢出的问题了。
内容的提问来源于stack exchange,提问作者Klaus
相关产品推荐
相关产品推荐

