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

Windows下Python串口通信需Ctrl+C才输出,求实时打印解决办法

Windows下串口数据实时打印问题分析与解决

问题原因

  1. 输出缓冲未即时刷新:Windows环境中Python的print默认采用行缓冲机制,部分控制台环境下缓冲区不会自动刷新,导致输出内容被暂存,直到程序终止才一次性输出。
  2. readline()的阻塞特性:readline()需要等待换行符(\n)或超时才返回数据。如果串口发送的数据不含换行符,或者Windows系统调度延迟导致超时未触发,会造成数据读取延迟。
  3. in_waiting检测时机问题:Windows串口驱动的延迟可能导致数据分批到达,循环检查in_waiting时可能错过数据就绪的时机,无法及时触发打印逻辑。

解决方法

1. 强制刷新输出缓冲区

在所有print语句中添加flush=True参数,强制将缓冲区内容立即输出到控制台:

import serial

ser = serial.Serial(
    port="COM4", baudrate=115200, bytesize=8, timeout=0.1, stopbits=serial.STOPBITS_ONE
)

while True:
    try:
        if ser.in_waiting > 0:
            print("found sth", flush=True)
            data = ser.readline()
            print(data, flush=True)
    except KeyboardInterrupt:
        break

2. 改用非换行依赖的读取方式

如果串口发送的数据没有换行符,放弃readline(),直接读取当前所有可用数据:

import serial
import time

ser = serial.Serial(
    port="COM4", baudrate=115200, bytesize=8, timeout=0.1, stopbits=serial.STOPBITS_ONE
)

while True:
    try:
        # 读取当前所有就绪数据,无数据时至少读取1字节(触发超时)
        data = ser.read(ser.in_waiting or 1)
        if data:
            print("found sth", flush=True)
            print(data, flush=True)
        # 短暂延迟降低CPU占用
        time.sleep(0.01)
    except KeyboardInterrupt:
        break

3. 调整串口超时参数

适当延长timeout值,确保数据能在超时前被完整读取,同时配合flush=True保证输出即时性。

内容的提问来源于stack exchange,提问作者afvmil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:25:28