【问题标题】:Write String to permanent flash memory of Arduino ESP32将字符串写入 Arduino ESP32 的永久闪存
【发布时间】:2019-05-14 22:54:35
【问题描述】:

我想在 Arduino ESP32 的闪存中写入一些文本。它有点工作,但不是我想要的。

void writeString(const char* toStore, int startAddr) {
  int i = 0;
  for (; i < LENGTH(toStore); i++) {
    EEPROM.write(startAddr + i, toStore[i]);
  }
  EEPROM.write(startAddr + i, '\0');
  EEPROM.commit();
}

我的电话

writeString("TEST_STRING_TO_WRITE", 0);

仅将 TEST 写入内存。我不理解为什么。是因为_吗?还是我错过了什么不同的东西?

这是使用的 LENGTH 宏

#define LENGTH(x) (sizeof(x)/sizeof(x[0]))

以及我用来再次从内存中读取字符串的方法(似乎工作正常):

String readStringFromFlash(int startAddr) {
  char in[128];
  char curIn;
  int i = 0;
  curIn = EEPROM.read(startAddr);
  for (; i < 128; i++) {
    curIn = EEPROM.read(startAddr + i);
    in[i] = curIn;
  }
  return String(in);
}

【问题讨论】:

    标签: arduino esp32 flash-memory eeprom


    【解决方案1】:

    LENGTH 宏到底是从哪里得到的?这是超现实的。

    sizeof 不会在这里做你想做的事。它是一个编译时函数,用于计算其参数的存储要求。在这种情况下,它应该返回字符指针的字节长度,而不是它指向的字符串。

    您想使用 strlen(),假设您的 char* 是正确终止的 C 字符串。添加一个以确保最后的“\0”也被存储。

    #define LENGTH(x) (strlen(x) + 1)
    

    【讨论】:

    • 它来自视觉工作室。非常感谢,它现在工作。但我认为 sizeof(x) 以字节为单位给出了数组的大小。这必须除以数组中数据类型的大小才能得到元素的数量
    • 如果您有char string[23];,那么sizeof(string); 将返回 23,即使您只在字符数组中存储了 5 个字符的字符串。如果您随后将string 作为参数传递给函数并在函数内部使用sizeof,您将(很可能取决于CPU)得到4,因为该函数只知道char *sizeof 返回存储其参数所需的字节数。
    • 这对String 来说真的很糟糕——如果你使用sizeof(String("verylongstring")),你会得到存储String 对象所需的字节数,而不是分配给存储的字节数它的数据。这一直在咬人。
    【解决方案2】:

    下面是演示在 EEPROM(永久存储)中存储和检索字符串 ssid 的代码。

    #include "EEPROM.h"
    
    int addr = 0;
    #define EEPROM_SIZE 64
    
    // the sample text which we are storing in EEPROM
    char ssid[64] = "CARNIVAL OF RUST";
    
    void setup() {
        Serial.begin(115200);
        Serial.println("starting now...");
    
        if (!EEPROM.begin(EEPROM_SIZE)) {
            Serial.println("failed to init EEPROM");
            delay(1000000);
        }
    
        // writing byte-by-byte to EEPROM
        for (int i = 0; i < EEPROM_SIZE; i++) {
            EEPROM.write(addr, ssid[i]);
            addr += 1;
        }
        EEPROM.commit();
    
        // reading byte-by-byte from EEPROM
        for (int i = 0; i < EEPROM_SIZE; i++) {
            byte readValue = EEPROM.read(i);
    
            if (readValue == 0) {
                break;
            }
    
            char readValueChar = char(readValue);
            Serial.print(readValueChar);
        }
    }
    
    void loop() {
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2015-01-17
      • 1970-01-01
      • 2020-10-12
      • 2021-04-30
      相关资源
      最近更新 更多