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

树莓派4B Ubuntu下Python记录HAT电流数据程序故障求助

问题根因

现有代码的故障点集中在三个位置:

  • 定时任务注册逻辑错误:schedule.every(1).seconds.do()被放在while True循环内部,每轮循环都会新增一个重复的定时任务,短时间内就会出现任务堆积,根本无法正常执行采集写入动作
  • 文件写入逻辑缺失/缓冲区未刷新:
    • CSV版本的time_fun函数仅做了计数和读值操作,完全没有调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:27:18