【问题标题】:SdFat write floats to file ESP32SdFat 将浮点数写入文件 ESP32
【发布时间】:2021-12-22 22:22:22
【问题描述】:

我需要将浮点数或字符串值写入 SDFAT 库中的 SDVolume Cache,我正在使用 ESP32 和 SdCard 模块。

  uint8_t* pCache = (uint8_t*)sd.vol()->cacheClear();
  memset(pCache, ' ', 512);
  for (uint16_t i = 0; i < 512; i += 4) {
    
    pCache[i + 0] = 'r'; // I Need to write a Float value or String into this cell
    pCache[i + 1] = ',';
    pCache[i + 2] = '0';
    pCache[i + 3] = '\n';
  }

库链接:https://github.com/greiman/SdFat

【问题讨论】:

  • 这是 C 还是 C++?不能两者兼而有之。这是否使用 Arduino 平台?无法从您的代码中分辨出来,但它看起来不像。 请不要使用“随机”标签”;不相关的标签只会导致专家无视您的问题。
  • 它是 Arduino,但通常该库是用 C++ 编写的。所以我们谈论的是 C++ 和 Arduino 平台。标签已更新,谢谢。

标签: c++ arduino esp32 sd-card


【解决方案1】:

第一:

// I Need to write a Float value or String into this cell

没有意义——“单元格”是单个字符,例如'e'。如何将完整的浮点值写入单个字符?

您可能只想用浮点数的字符串表示填充pCache。那就这样做吧!

我们已经掌握了所有的 C++,所以让我们使用一种更节省内存的方法:

std::to_chars 是 C++ 将数值转换为字符串的方法。类似的东西

#include <charconv>
…
    std::to_chars(pCache, pCache+512-1, floatvalue);

应该是合适的。

几件事:

  • 如果您需要知道字符串在哪里结束,您需要零终止字符串。所以,而不是memset(pCache, ' ', 512)memset(pCache, 0, 512);会更明智。
  • 您确定您使用了正确的功能吗? vol()-&gt;cacheClear() 非常明确地标记为“不要在您的应用程序中使用”here!对我来说,您将字符串写入某个块设备缓存而不是从文件系统获取文件的缓冲区,或者将缓冲区传递给文件系统以写入文件,这似乎也很不寻常。

【讨论】:

  • 我的应用程序需要像您说的那样使用缓冲区将数据以高频率记录到文件中,您能否提出任何解决方案来做到这一点,我需要将 1 kHz 记录到文件中。这些行可能包含字符串。如何用缓冲区替换设备缓存。
  • 1 kHz 不是“高频”。再一次,您试图将字符串放入char,这完全没有意义,我无法确定您对字符串或字符的含义!而且您真的不应该用缓冲区替换设备缓存 - 这也没有任何意义,您需要该缓存能够定期写入。
  • 另外,如果您需要高速率,将浮点数转换为字符串进行存储从不是一个好主意。只需将该文件制作为二进制文件,如有必要,在读取时将浮点数转换为字符串,而不是在资源有限的设备上写入带宽受限的存储介质时。
  • 我在回答中完全回答了这个问题。你拿一个缓冲区,在上面使用std::to_chars,然后把它交给你的文件系统。
  • 抱歉,无法从此处远程修复您的构建设置。我也有点困惑您使用的是第三方 SD / Fat 库 - ESP32-arduino 构建的底层 ESP32 库本身具有经过更好测试、更成熟的 SDcard / FAT 库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2018-01-21
  • 2013-05-22
相关资源
最近更新 更多