Python读取串口数据的while循环无法通过Ctrl+C终止的解决方法
解决Python串口读取时Ctrl+C无法终止程序的问题
问题出在你的try-except仅包裹了串口读取的单行代码,Python的KeyboardInterrupt可能在循环的其他执行阶段触发,无法被当前的捕获逻辑覆盖。另外,若串口未设置超时,部分串口操作会阻塞信号处理流程,导致Ctrl+C无法响应。
修复方案:
- 将整个
while True循环放入try块中,确保任何阶段触发的KeyboardInterrupt都能被捕获 - 给串口设置合理的超时时间(比如1秒),避免串口操作长时间阻塞
- 退出时关闭串口,释放硬件资源
修复后的代码示例:
import serial # 根据实际端口、波特率调整,必须设置timeout参数 ser = serial.Serial('COMx', 9600, timeout=1) data = "" try: while True: # 读取当前缓冲区所有数据,忽略解码错误避免程序崩溃 chunk = ser.read(ser.inWaiting()).decode("utf-8", errors="ignore") if chunk: data += chunk # 检查是否收到完整行,处理所有已完成的输入 if "\n" in data: lines = data.split("\n") # 打印所有完整行,保留最后一段不完整数据 for line in lines[:-1]: print(line) data = lines[-1] except KeyboardInterrupt: print("\n程序已终止") finally: ser.close() # 确保退出时关闭串口
关键说明:
- 串口超时设置:
timeout=1让串口读取操作最多等待1秒就返回,避免无限阻塞,保证循环能周期性检查信号 - 扩大try捕获范围:把整个循环逻辑纳入
try块,确保KeyboardInterrupt无论在哪个环节触发都能被捕获 - 优化数据处理:改用
"\n" in data判断完整行,分割后处理所有有效输入,避免丢失未完成的内容 - finally块释放资源:确保程序无论正常退出还是异常终止,都能正确关闭串口,避免占用硬件资源
内容的提问来源于stack exchange,提问作者Shookti
相关产品推荐
相关产品推荐

