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'
代码运行不稳定:有时能正常显示每次重量变化,有时仅显示初始重量,后续重量变化无法更新。
解决方案
原因分析
readline()依赖换行符\n触发读取,但串口缓冲区残留旧数据、通信丢包,或time.sleep(1)的过长休眠会导致错过实时数据帧。- 串口参数(如流控)或秤的输出模式(非连续更新)未匹配代码配置。
- 未处理缓冲区积压数据,导致初始读取后后续数据无法正常获取。
具体解决方法
初始化+循环内清空串口缓冲区
连接串口后先清空输入缓冲区,避免旧数据干扰;每次循环前再次清空,防止数据积压。同时补充缺失的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
相关产品推荐
相关产品推荐

