读取串口回复时出现IndexError [重复]

Posted

技术标签:

【中文标题】读取串口回复时出现IndexError [重复]【英文标题】:Getting IndexError when reading serial port reply [duplicate] 【发布时间】:2021-09-28 18:45:38 【问题描述】:

我在使用 SDS011 空气质量传感器的 Python 模块时遇到了问题,而且我还不够精通,不知道如何解决这个问题。

一般来说,代码运行良好,但偶尔(例如每天一次左右)代码会抛出“IndexError: index out of range”,导致我的 python 应用程序停止。

本例程中sds011.py文件出现根据traceback打印输出的错误:

def _get_reply(self):
    """Read reply from device."""
    raw = self.ser.read(size=10)
    data = raw[2:8]
    if len(data) == 0:
        return None
    if (sum(d for d in data) & 255) != raw[8]:
        return None  #TODO: also check cmd id
    return raw

这个例程的代码可以在 github 上找到:https://github.com/ikalchev/py-sds011/

错误发生就行了

if (sum(d for d in data) & 255) != raw[8]:

这里有什么问题,我该如何正确处理?

【问题讨论】:

raw[8] 必须以某种原因索引超出范围,可能会抛出一个 try/except 块,以防您没有得到足够的数据,并处理它但是对您的应用有意义 我投票结束这个问题作为Python IndexError: list index out of range. Cannot access by index的副本 【参考方案1】:

问题大概是这样的:

raw = self.ser.read(size=10)

self.ser 设置了超时时,这不一定会准确读取 10 个字节。它读取最多 10 个字节——如果超时在所有字节可用之前到期,它将小于 10。见pySerial's documentation of .read()

这解释了为什么您每天只看到一次问题。可能存在一些间歇性电气问题,偶尔会丢失一些字节。所以当你访问raw[8]时,raw中没有那么多字节,你得到一个IndexError

您可以:

检查是否len(data) < 10。如果是,请处理错误。 在初始化self.ser 时通过传递timeout=None 禁用超时。那么self.ser.read(10) 将总是返回正好 10 个字节,如果它曾经返回过。

【讨论】:

以上是关于读取串口回复时出现IndexError [重复]的主要内容,如果未能解决你的问题,请参考以下文章

读取用户 ID 以回复消息时出现问题。带有 Aiogram 的 Telegram 机器人

Python错误IndexError:只有整数

COCO数据集使用super categories时出现IndexError: list index out of range

COCO数据集使用super categories时出现IndexError: list index out of range

如何修复 rs232 串口超时?

异常导致终端重复IndexError