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

Python读取串口数据的while循环无法通过Ctrl+C终止的解决方法

解决Python串口读取时Ctrl+C无法终止程序的问题

问题出在你的try-except仅包裹了串口读取的单行代码,Python的KeyboardInterrupt可能在循环的其他执行阶段触发,无法被当前的捕获逻辑覆盖。另外,若串口未设置超时,部分串口操作会阻塞信号处理流程,导致Ctrl+C无法响应。

修复方案:

  1. 将整个while True循环放入try块中,确保任何阶段触发的KeyboardInterrupt都能被捕获
  2. 给串口设置合理的超时时间(比如1秒),避免串口操作长时间阻塞
  3. 退出时关闭串口,释放硬件资源

修复后的代码示例:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:26:16