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

读取SDS011串口返回数据时触发IndexError应如何解决?

问题成因
  • 核心原因是串口读取逻辑没有校验返回数据的总长度:SDS011的标准返回帧固定为10字节,代码中ser.read(size=10)在串口通信受干扰、传感器临时丢包、连接不稳定时,可能返回长度小于10的字节串
  • 原代码仅判断了data = raw[2:8]的长度是否为0,即使raw总长度不足10,只要raw长度≥3,切片出来的data长度就≥1,不会触发返回None的逻辑,执行到raw[8]时就会触发索引越界错误
修复方案

方案1:修改_get_reply方法的校验逻辑(推荐)

在读取raw之后先判断总长度是否为10字节,不符合直接返回None,修改后的代码如下:

def _get_reply(self):
    """Read reply from device."""
    raw = self.ser.read(size=10)
    # 新增校验:必须读到完整的10字节帧才继续处理
    if len(raw) != 10:
        return None
    data = raw[2:8]
    if (sum(d for d in data) & 255) != raw[8]:
        return None  #TODO: also check cmd id
    return raw

方案2:上层调用增加异常捕获兜底

如果不方便修改依赖库的源码,可以在调用sds011相关读取方法的外层增加IndexError捕获,捕获到异常时执行重试逻辑即可,示例代码:

from sds011 import SDS011
sensor = SDS011("/dev/ttyUSB0", use_query_mode=True)
while True:
    try:
        pm25, pm10 = sensor.query()
        # 正常处理数据逻辑
    except IndexError:
        # 触发越界错误时跳过本次读取,等待下一次轮询即可
        continue

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:54:05