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

pyserial读取串口传感器数据绘图时字符串无法转float报错排查

问题原因
  • 代码存在赋值遗漏:执行a.decode()时没有接收返回值,变量a始终是pyserial读取到的原始bytes类型,本身就无法直接传入float()做转换。
  • 串口流式读取存在帧错位:串口传输是连续无边界的字节流,脚本打开串口时不一定刚好对齐Arduino单次Serial.println()输出的起始位置,很容易读到截断的半帧数据。报错里的b'--1.80\r\n'就是典型的帧错位结果:上一帧末尾残留的-和新一帧开头的-1.80拼接,形成了带连续负号的非法数字格式,同时内容末尾携带的\r\n换行符也会干扰类型转换。
修复方法
  1. 补全解码赋值逻辑,解码后通过strip()清除字符串首尾的换行、回车、空白字符。
  2. 打开串口后立刻清空输入缓冲区,丢弃打开瞬间残留的乱码、半帧数据,从干净的流位置开始读取。
  3. 增加转换异常捕获,遇到偶发的错位非法数据直接跳过,避免整个读取流程中断。

修正后的可运行代码如下:

import serial
import matplotlib.pyplot as plt

s = serial.Serial(
      port='COM6',
      baudrate=57600,
      parity=serial.PARITY_NONE,
      stopbits=serial.STOPBITS_ONE,
      bytesize=serial.EIGHTBITS,
      timeout=1
)
# 清空打开串口时残留的无效数据
s.reset_input_buffer()

x = 0
plt.ylabel("Pressure")
plt.xlabel("Time")
while x < 1000:
    raw_bytes = s.readline()
    # 解码并清洗无效首尾字符
    data_str = raw_bytes.decode('utf-8').strip()
    if not data_str:
        continue
    try:
        y = float(data_str)
    except ValueError:
        # 遇到格式错误的截断数据直接跳过
        continue
    plt.plot(x, y)
    x += 1

plt.show()

补充:如果后续仍偶发双负号类的格式错误,可在float()转换前增加字符串预处理逻辑,将连续的-替换为单个-即可,优先使用异常捕获方案可以避免误改正常采集数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:36:15