树莓派4B Ubuntu下Python记录HAT电流数据程序故障求助
问题根因
现有代码的故障点集中在三个位置:
- 定时任务注册逻辑错误:
schedule.every(1).seconds.do()被放在while True循环内部,每轮循环都会新增一个重复的定时任务,短时间内就会出现任务堆积,根本无法正常执行采集写入动作 - 文件写入逻辑缺失/缓冲区未刷新:
- CSV版本的
time_fun函数仅做了计数和读值操作,完全没有调用csv写入方法;且循环内反复写入表头行,即使逻辑跑通也会生成无效数据 - 两个版本的代码都没有主动刷新文件缓冲区,写入的内容会一直驻留在内存中,只有程序正常退出时才会落到磁盘,强制终止的情况下文件会一直显示为空
- CSV版本的
- 退出逻辑阻塞:两层嵌套的无退出条件死循环会阻塞信号监听,第三方按键库需要root权限才能在树莓派Ubuntu系统下监听全局按键,未提权的情况下回调不会触发,只能强制杀进程
修正后可直接运行的代码
采用CSV格式存储,可直接导入R、Excel做后续分析,不需要额外安装第三方按键依赖,兼容树莓派本地运行、SSH远程运行两种场景:
import megaind from datetime import date import csv import schedule import time # 设定输出电流,增加输入合法性校验 while True: amperage = input("Input the desired amperage.The input must be between 4 and 20:\n") try: amperage = float(amperage) if 4.0 <= amperage <= 20.0: break print("please input a number between 4 and 20:\n") except ValueError: print("please input a valid number:\n") megaind.set4_20Out(0, 1, amperage) # 初始化采集参数 today = date.today() time_count = 0 file_path = f'/home/laserlab/Desktop/discharge files/{today}.csv' def collect_and_write(writer): global time_count time_count += 1 current_val = megaind.get4_20In(0, 1) writer.writerow([time_count, current_val]) # 强制刷新文件缓冲区,写入内容立即落盘 csvfile.flush() if __name__ == "__main__": # 打开文件,newline参数避免CSV生成空行 with open(file_path, 'a', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) # 首次运行写入表头 writer.writerow(["time_sec", "current_mA"]) csvfile.flush() # 仅注册一次定时采集任务,禁止放在循环内重复注册 schedule.every(1).seconds.do(collect_and_write, writer) print("Collection started, press Ctrl+C to stop safely") try: while True: schedule.run_pending() # 缩短休眠间隔,避免定时采集出现时间偏移 time.sleep(0.1) except KeyboardInterrupt: print("\nStop signal received, all data has been saved, exiting...")
关键修改说明
- 移除了嵌套的两层死循环,将定时任务注册移到主循环外,从根源避免任务重复注册导致的逻辑卡死
- 每次写入操作后调用
flush()方法强制刷盘,不需要等程序退出就能实时看到文件内的采集数据,即使意外断电也只会丢失最近1秒的数据 - 补全了CSV写入逻辑,仅在程序首次启动时写入一次表头,不会出现重复表头污染数据的问题
- 采用系统原生的
KeyboardInterrupt信号(终端按Ctrl+C触发)作为退出触发方式,不需要安装额外的按键监听库,不需要root权限,本地运行、SSH远程运行都能正常触发,捕获信号后会自动安全退出,不会损坏数据文件 - 增加了输入值异常捕获,输入非数字内容时不会直接崩溃,会提示重新输入
- 将主循环休眠时间从1秒调整为0.1秒,避免schedule库的定时检查出现时间漂移,保证每秒准点采集
内容的提问来源于stack exchange,提问作者Caprapas
相关产品推荐
相关产品推荐

