You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:13:15