While True、Try循环开发问题:数据采集异常处理与时序丢失
问题解决方案
1. 连接失败时写入0值的处理
你当前的except块仅给value1赋值0,但未将这个0加入数据列表,也没处理异常后的流程延续。应该把read("x1")的调用单独包裹在try-except中,捕获连接/读取异常时,主动将0添加到list0,保证循环正常执行:
while len(list0) < 60: try: value1 = read("x1") # 单独捕获读取操作的异常 except Exception as e: # 建议替换为具体异常类,比如ConnectionError、TimeoutError等,避免掩盖其他bug print(f"读取失败: {e}") value1 = 0 # 失败时赋值0 list0.append(value1) # 注意:你代码里的d[value1]=list0逻辑有问题,value1是变量,每次会覆盖字典的键,建议检查这个逻辑的用途 time.sleep(0.5)
外层的try-except不要过于宽泛,尽量只捕获预期的异常类型,防止隐藏其他代码错误。
2. 解决时序丢失问题
你当前用round(tStart/60)*60对齐分钟,但time.sleep(0.5)加上读取操作的耗时,可能导致60次循环总时间超过1分钟,或者下一轮循环的时间直接跳到下一分钟,导致跳过时间点。
正确做法是基于固定时间点调度,先锁定当前要处理的分钟,确保每个时间节点(00:01、00:02等)都能被精准触发:
import time from datetime import datetime, timedelta while True: # 锁定当前分钟的起始时间(比如00:01:00的时间点) now = datetime.now() current_minute = now.replace(second=0, microsecond=0) # 计算下一分钟的起始时间,用于后续等待对齐 next_minute = current_minute + timedelta(minutes=1) t_write_time = current_minute.strftime('%Y/%m/%d %H:%M') list0 = [] # 在当前分钟内,严格按0.5秒间隔读取60次 for _ in range(60): try: value1 = read("x1") except Exception as e: print(f"读取失败: {e}") value1 = 0 list0.append(value1) # 计算下一次读取的精准时间,弥补读取操作的耗时 next_read_time = time.time() + 0.5 time.sleep(max(0, next_read_time - time.time())) # 计算平均值并写入文件 avg0 = sum(list0) / len(list0) if list0 else 0 with open(filename, "a", newline='') as f_output: csv_output = csv.writer(f_output, delimiter=";") csv_output.writerow(['Name', t_write_time, f"{avg0:.3f}"]) # 保留你原有的list9逻辑 avg9 = 1/1 # 你的a和b均为1,直接写结果,建议检查此逻辑的实际用途 list9.append(avg9) if len(list9) == 10: list9.clear() break # 等待到下一分钟的起始点,确保时序不丢失 time.sleep(max(0, next_minute.timestamp() - time.time()))
时序修复核心点:
- 先锁定当前处理的分钟,避免读取耗时导致时间跳变
- 每次读取后计算下一次的精准时间点,用
time.sleep(max(0, next_read_time - time.time()))弥补操作耗时,保证严格0.5秒间隔 - 分钟结束后等待到下一分钟起始点再开始下一轮,确保每个时间节点都被处理
额外提示
- 检查
d[value1]=list0逻辑:value1是动态读取的数值,作为字典键会被不断覆盖,建议确认该字典的实际用途 - 优先捕获具体异常类,而非宽泛的
Exception,便于定位问题 - 可添加日志记录连接失败的细节,方便后续排查
内容的提问来源于stack exchange,提问作者Student_e
相关产品推荐
相关产品推荐

