Python读取DS18B20传感器时while循环陷入无限循环求助
问题分析与解决方案
看起来你的循环“卡”在第一行的原因可能有几个,我来帮你逐一排查:
1. 最可能的原因:异常中断了循环执行
你的代码在处理第一个传感器时,如果打开w1_slave文件失败(比如传感器ID无效、文件路径错误,或者传感器暂时无响应),Python会直接抛出异常并终止程序,导致后续的sensor=fp.readline()根本没机会执行,看起来就像循环停在了第一行。
你可以给文件操作加上异常处理,这样即使某个传感器出问题,程序也能继续处理下一个:
filepath = "/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves" with open(filepath) as fp: sensor = fp.readline() while sensor: sensor_id = sensor.strip() print("Sensor: {}".format(sensor_id)) try: # 尝试读取传感器数据 with open("/sys/bus/w1/devices/" + sensor_id + "/w1_slave") as fp1: sensor_data = fp1.read() print(sensor_data.strip()) except FileNotFoundError: print(f"警告:找不到传感器 {sensor_id} 的数据文件,请检查传感器连接") except Exception as e: print(f"读取传感器 {sensor_id} 时出错:{str(e)}") # 确保这行代码执行到,才能读取下一个传感器 sensor = fp.readline()
2. 检查传感器列表文件的内容
先确认w1_master_slaves文件里确实有多个传感器ID。你可以在终端执行以下命令查看:
cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves
如果输出只有一行,那你的循环本来就只会处理一个传感器,这是正常情况。
3. 优化代码:一次性读取所有传感器ID
用readline()逐行读取有时候会因为文件指针的问题(比如系统动态更新这个sysfs文件)出现意外,换成一次性读取所有行的方式会更可靠:
filepath = "/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves" with open(filepath) as fp: # 读取所有行,过滤掉空白行,得到有效的传感器ID列表 sensor_ids = [line.strip() for line in fp if line.strip()] # 遍历所有传感器ID for sensor_id in sensor_ids: print(f"Sensor: {sensor_id}") try: with open(f"/sys/bus/w1/devices/{sensor_id}/w1_slave") as fp1: sensor_data = fp1.read() print(sensor_data.strip()) except Exception as e: print(f"处理传感器 {sensor_id} 失败:{str(e)}")
这种写法逻辑更清晰,也不容易出现循环卡住的问题。
内容的提问来源于stack exchange,提问作者Zoli
相关产品推荐
相关产品推荐

