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

如何在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

关键逻辑说明

  1. 异常捕获:当float()转换失败或数据分割后元素不足时,自动进入修复流程
  2. 缓存清理:ser.flushInput()会清空串口接收缓存,避免无效数据一直干扰后续读取
  3. 跳过无效行:调用ser.readline()读取当前缓存里的剩余内容(不管长度),确保下一次读取能拿到新的、完整的数据
  4. 数据预处理:把字节串解码为字符串并去掉空白,避免因换行符、空格导致分割错误

额外注意事项

  • 如果串口数据的编码不是utf-8,可以换成对应的编码(比如gbk),避免解码失败
  • 可以增加重试次数限制,比如连续N次失败后重启串口(ser.close()再重新初始化)
  • 检查硬件连接是否稳定,比如串口线是否松动、设备供电是否正常,这些也可能导致数据损坏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:45:49