读取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
相关产品推荐
相关产品推荐

