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

ESP32如何将磁盘、内存、PSRAM使用率转为百分比?代码异常求助

问题分析与修复方案

核心问题排查

1. 全局变量持续累加导致数值异常

memory、memoryPsram、disk作为全局变量,每次进入loop()都会在原有值基础上累加10次计算结果,导致数值不断膨胀(比如第一次正确值是47.6,第十次就会变成476)。

2. 整数除法导致PSRAM/磁盘使用率为0

ESP32相关内存、磁盘函数返回的是整数类型,直接执行(ESP.getFreePsram() * 100 / ESP.getPsramSize())这类整数运算时,若分子小于分母,整数除法会直接截断为0,最终结果自然是0。

3. PSRAM未启用或硬件不支持

如果你的ESP32模块不带PSRAM,或者在PlatformIO配置中未开启PSRAM支持,ESP.getPsramSize()会返回0,触发代码分支直接取0值。

4. SPIFFS挂载未做错误校验

代码直接调用SPIFFS.begin(),未检查挂载结果,若挂载失败,totalBytes()返回0,同样会触发分支取0值。

修复后的代码

#include <SPIFFS.h>

void setup() {
  Serial.begin(115200);
  Serial.println("Arrancando telemetria: ");
  
  // 检查SPIFFS挂载状态,失败时输出提示
  if(!SPIFFS.begin(true)){
    Serial.println("SPIFFS挂载失败");
    return;
  }
}

void loop() {
  float memory = 0.0;
  float memoryPsram = 0.0;
  float disk = 0.0;  

  for (int i = 0; i < 10; i++)
  {
      // 内存使用率计算:先转浮点避免整数截断
      if(ESP.getHeapSize() > 0){
        float usedHeap = ESP.getHeapSize() - ESP.getFreeHeap();
        memory += (usedHeap / ESP.getHeapSize()) * 100;
      }

      // PSRAM使用率计算
      if(ESP.getPsramSize() > 0){
        float usedPsram = ESP.getPsramSize() - ESP.getFreePsram();
        memoryPsram += (usedPsram / ESP.getPsramSize()) * 100;
      } else {
        memoryPsram += 0.0; // 无PSRAM时返回0
      }

      // SPIFFS磁盘使用率计算
      if(SPIFFS.totalBytes() > 0){
        disk += ((float)SPIFFS.usedBytes() / SPIFFS.totalBytes()) * 100;
      } else {
        disk += 0.0;
      }
  }
      
  Serial.print("Memory: ");
  Serial.println(memory/10, 2); // 保留两位小数输出
  Serial.print("Memory Psram: ");
  Serial.println(memoryPsram/10, 2);
  Serial.print("Disk: ");
  Serial.println(disk/10, 2);
  
  delay(1000);
}

PSRAM启用配置(针对带PSRAM的模块)

如果你的ESP32模块搭载了PSRAM,需要在PlatformIO的platformio.ini中添加以下配置开启支持:

build_flags = 
  -DBOARD_HAS_PSRAM
  -mfix-esp32-psram-cache-issue

关键修复点说明

  • 将统计变量移至loop()内部,每次循环重新初始化,彻底解决累加问题
  • 先将整数转换为浮点型再执行除法,避免整数截断导致的0值问题
  • 增加SPIFFS挂载错误检查,便于快速定位磁盘异常
  • 调整使用率计算逻辑为「已使用空间/总空间*100」,逻辑更直观清晰
  • 使用Serial.println(value, 2)控制输出小数位数,格式更规范

内容的提问来源于stack exchange,提问作者joaquinStrada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:15:59