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

Python串口读取Ohaus Ranger Count 3000秤数据不稳定问题求助

问题:Ohaus Ranger Count 3000秤串口读取不稳定,仅偶尔更新重量

我使用Ohaus Ranger Count 3000秤,通过RS232-USB线缆连接到RevPi设备。以下是我的Python代码:

import serial

ser = serial.Serial(
     port='/dev/ttyUSB0',
     baudrate = 9600,
     parity=serial.PARITY_NONE,
     stopbits=serial.STOPBITS_ONE,
     bytesize=serial.EIGHTBITS,
)

while 1:
    x=ser.readline()
    print(x)
    time.sleep(1)

秤空载时输出示例:

b'          0     g    G \r\n'

代码运行不稳定:有时能正常显示每次重量变化,有时仅显示初始重量,后续重量变化无法更新。


解决方案

原因分析

  1. readline()依赖换行符\n触发读取,但串口缓冲区残留旧数据、通信丢包,或time.sleep(1)的过长休眠会导致错过实时数据帧。
  2. 串口参数(如流控)或秤的输出模式(非连续更新)未匹配代码配置。
  3. 未处理缓冲区积压数据,导致初始读取后后续数据无法正常获取。

具体解决方法

  • 初始化+循环内清空串口缓冲区
    连接串口后先清空输入缓冲区,避免旧数据干扰;每次循环前再次清空,防止数据积压。同时补充缺失的time模块导入,添加超时参数避免阻塞:

    import serial
    import time
    
    ser = serial.Serial(
         port='/dev/ttyUSB0',
         baudrate=9600,
         parity=serial.PARITY_NONE,
         stopbits=serial.STOPBITS_ONE,
         bytesize=serial.EIGHTBITS,
         timeout=1  # 设置超时,避免readline()无限等待
    )
    
    ser.flushInput()  # 初始化时清空缓冲区
    
    while True:
        ser.flushInput()
        data = ser.readline()
        if data:  # 仅输出非空数据
            print(data.decode('ascii').strip())  # 解码为字符串并去除冗余空格/换行
        time.sleep(0.1)  # 缩短休眠时间,提升响应速度
    
  • 确认秤的串口配置与输出模式
    检查Ohaus Ranger Count 3000的设置:

    • 确保流控(硬件/软件流控)设置为无,与代码参数匹配
    • 将秤的数据输出模式调整为连续输出(部分秤默认是重量稳定后仅输出一次,需改为实时更新)
  • 改用固定长度读取替代readline()
    从示例输出看,秤的输出格式固定,可直接读取固定字节数,避免依赖换行符:

    while True:
        ser.flushInput()
        # 根据实际输出长度调整,示例输出约20字节
        data = ser.read(20)
        if len(data) == 20:
            print(data.decode('ascii').strip())
        time.sleep(0.1)
    
  • 添加异常处理
    捕获串口异常,防止设备断开导致程序崩溃:

    try:
        while True:
            ser.flushInput()
            data = ser.readline()
            if data:
                print(data.decode('ascii').strip())
            time.sleep(0.1)
    except serial.SerialException as e:
        print(f"串口错误: {e}")
        ser.close()
    except KeyboardInterrupt:
        ser.close()
        print("程序退出")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:35:36