处理偶尔的 i2c 写入错误,Python + Raspberry Pi

Dealing with occational i2c write errors, Python + RaspberryPi

我有一个 RaspberryPi 通过它的 i2c 总线连接到一个 temperature/humidity 传感器。通常一切都很好,我发送写入命令并监听响应。然而,脚本时不时地因同样的错误而崩溃。

Traceback (most recent call last):
  File "humidify.py", line 20, in <module>
    humidity = HTU21DF.read_humidity()
  File "/home/pi/Desktop/Projects/HTU21DF.py", line 51, in read_humidity
    pi.i2c_write_byte(handle, rdhumi) # send read humi command
  File "/usr/local/lib/python2.7/dist-packages/pigpio.py", line 1861, in i2c_write_byte
    _pigpio_command(self.sl, _PI_CMD_I2CWS, handle, byte_val))
  File "/usr/local/lib/python2.7/dist-packages/pigpio.py", line 683, in _u2i
    raise error(error_text(v))
pigpio.error: 'I2C write failed'

我不想排除导致偶尔出现错误的原因,我希望我的脚本稍等片刻,然后再次尝试 i2c 写入命令。如果我能做到这一点,那么我就真的能够自动化我的系统,而不必经常检查它是否崩溃。

我是编程新手,所以这可能是一些基础知识。

阅读异常处理。在 python 中,您创建一个包含您正在尝试的操作的 try 块,然后是一个或多个 except 块,每个块命名一个或多个异常 类有兴趣处理。在这种情况下,您会看到 pigpio.error 个异常。

你可能会做的是:

# try up to 3 times on a failure
success = False
caught_exception = None
for _ in range(3):
    try:
        pi.i2c_write_byte(...etc...)
        # if we get here, we succeeded, so break out of the loop
        success = True
        break
    except pigpio.error as e:
        print "error: %s"%(e)
        # wait a second for the retry
        time.sleep(1)

if not success:
    print "Failed after 3 retries!"

我自己一直在处理这个问题,Raspberry Pi2 <-> MCP23016,答案很可能是,您使用的是 MCP230xx,您需要将复位引脚连接到高电平。