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

