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

Python中Serial.read读取串口数据丢失的问题求助

Python中Serial.read读取串口数据丢失的问题求助

嗨,我之前碰到过类似的串口通信丢数据的问题,咱们一步步来排查解决哈!

首先先提个小细节:你代码里的timeout=10000单位是秒哦,这意味着要等2.7小时才会超时,这显然不太合理,建议先改成timeout=10(10秒)这类符合实际通信场景的数值,避免不必要的等待。

针对你遇到的丢数据问题,给你几个可行的解决方向:

  • 启用硬件/软件流控
    从你说“发送端加微秒延迟就正常”来看,很大概率是接收端跟不上发送端的速度,导致数据在传输过程中丢失。你可以在初始化串口的时候启用流控,让发送端在接收端缓冲区满的时候暂停发送:

    comm = serial.Serial(slaveName, baudrate=115200, timeout=10, rtscts=True)  # 硬件流控
    # 或者用软件流控:xonxoff=True
    
  • 调整接收缓冲区大小
    虽然33字节不算多,但有时候默认的串口接收缓冲区可能偏小,你可以手动设置更大的缓冲区:

    comm = serial.Serial(slaveName, baudrate=115200, timeout=10)
    comm.set_buffer_size(rx_size=1024)  # 设置接收缓冲区为1024字节
    
  • 改用循环累计读取的方式
    有时候串口数据是分批到达的,直接用read(length)可能因为某些原因提前返回,你可以改成循环读取直到拿到足够的字节:

    def readLen(length):
        msg = bytearray()
        while len(msg) < length:
            # 读取剩余需要的字节数
            chunk = comm.read(length - len(msg))
            if not chunk:
                # 超时,返回已读取的部分或者做错误处理
                print("读取超时,仅收到部分数据")
                break
            msg.extend(chunk)
        return msg
    
  • 确认串口参数完全匹配
    务必确保发送端和接收端的所有串口参数完全一致:波特率(115200)、数据位(默认8)、停止位(默认1)、奇偶校验(默认无),哪怕有一个参数不匹配,都可能导致数据丢失或错乱。

另外你提到“读单个字节循环也有同样问题”,这说明不是read方法的问题,而是底层传输或接收配置的问题,优先试试流控和参数匹配的方案,应该能解决你的问题~

备注:内容来源于stack exchange,提问作者Caroline

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:13:02