DHT22传感器读取失败后无法重试问题求助
问题分析与解决方案
你的问题核心是没注意到新版Adafruit DHT库的缓存机制,以及当前循环逻辑的局限性:
- 库的
device.temperature属性默认会缓存上次成功读取的值,当传感器断开后,读取操作可能不会抛出RuntimeError,而是直接返回缓存的旧值,导致你的重试逻辑根本不会触发。 - 你的内层循环只在每次外层循环启动时执行一次,只要拿到一个值(哪怕是缓存的旧值)就会跳出循环打印,后续不会再尝试重新读取验证传感器状态。
修正后的代码
import time import adafruit_dht import board device1 = adafruit_dht.DHT22(board.D4) while True: t1 = None while t1 is None: try: # 先触发一次主动测量,确保获取最新数据 device1.measure() temp = device1.temperature hum = device1.humidity # 额外校验数据有效性,避免无效值或缓存 if temp is not None and hum is not None: t1 = temp else: time.sleep(0.1) except RuntimeError: # 读取失败时短暂休眠后重试 time.sleep(0.1) print("Device 1:", t1) time.sleep(2)
你遗漏的核心概念
- 硬件库的缓存策略:为了减少硬件访问压力,很多传感器库会缓存读取结果,直接访问属性不一定会触发新的硬件读取,需要调用显式的测量方法(比如
measure())来获取最新数据。 - 数据有效性校验:即使没有抛出异常,传感器返回的数据也可能无效(比如
None),必须主动校验才能确保拿到的是有效数据。 - 循环逻辑的持续性验证:你的原有逻辑只在每次循环开始时尝试获取一次有效值,之后就不再验证传感器状态,需要让重试逻辑覆盖每次读取的全流程,确保打印的始终是最新的有效数据。
内容的提问来源于stack exchange,提问作者poseydoom
相关产品推荐
相关产品推荐

