如何在Python串口读取脚本中自动处理InvalidLiteral错误?
解决串口读取触发InvalidLiteral错误的自动化修复方案
这个问题我碰到过类似的情况,核心原因是串口读取到了不完整或格式错误的数据(比如截断的字节、空行、非数字字符),导致转float时触发InvalidLiteral(本质是ValueError的子类)。你手动切换readline()再改回去的操作,其实是在清空串口缓存里的无效数据,之后才能读到正常内容。下面直接给你整合了修复逻辑的完整代码,再解释关键细节:
首先修正原代码的一个严重问题
你原来在for a in range(100)循环里重复创建serial.Serial对象,这会导致串口被频繁打开/关闭,很容易引发读取异常。正确的做法是只初始化一次串口,放在所有循环外面:
import serial # 只初始化一次串口,不要放在循环里 ser = serial.Serial( port='/dev/ttyAMA0', baudrate=38400, # 115200 is SMC-MRU, 9600 parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 )
整合自动修复逻辑的读取循环
我们通过异常捕获来检测转换失败的情况,然后自动执行类似你手动操作的逻辑:清空串口缓存、跳过无效数据,之后重新尝试读取。同时还会处理数据不完整的情况:
counter = 0 while True: try: # 先尝试读取指定长度的行 x = ser.readline(18) # 跳过空的读取结果 if not x: continue # 把字节串解码为字符串,去掉首尾空白(比如换行符) x_str = x.decode('utf-8').strip() x2 = x_str.split(',') # 检查是否有至少2个数据元素 if len(x2) < 2: raise ValueError(f"数据格式错误,分割后仅得到 {len(x2)} 个元素: {x_str}") # 转换为浮点数 Yaxis = float(x2[1]) Xaxis = float(x2[0]) # 这里可以添加你的业务逻辑,比如打印、存储数据 print(f"读取成功 | X: {Xaxis:.2f}, Y: {Yaxis:.2f}") counter += 1 except ValueError as e: # 捕获转换失败或格式错误的异常 print(f"数据处理失败: {e},正在清理缓存并重试...") # 清空串口输入缓存,丢弃所有未读取的无效数据 ser.flushInput() # 读取一次当前缓存的剩余数据(模拟你手动改readline()的操作) ser.readline() # 继续循环,重新尝试读取 continue
关键逻辑说明
- 异常捕获:当
float()转换失败或数据分割后元素不足时,自动进入修复流程 - 缓存清理:
ser.flushInput()会清空串口接收缓存,避免无效数据一直干扰后续读取 - 跳过无效行:调用
ser.readline()读取当前缓存里的剩余内容(不管长度),确保下一次读取能拿到新的、完整的数据 - 数据预处理:把字节串解码为字符串并去掉空白,避免因换行符、空格导致分割错误
额外注意事项
- 如果串口数据的编码不是
utf-8,可以换成对应的编码(比如gbk),避免解码失败 - 可以增加重试次数限制,比如连续N次失败后重启串口(
ser.close()再重新初始化) - 检查硬件连接是否稳定,比如串口线是否松动、设备供电是否正常,这些也可能导致数据损坏
内容的提问来源于stack exchange,提问作者Infernez
相关产品推荐
相关产品推荐

