ESP32 NVS-Wert in std::string einlesen

In unserem vorherigen Post haben wir Länge / Größe eines NVS-Werts auf ESP32 abrufen besprochen. Darauf basierend können wir einen NVS-Wert in einen std::string einlesen.

Strategie

  1. Größe des Werts im NVS ermitteln
  2. Temporären Buffer der ermittelten Größe allozieren
  3. Wert aus dem NVS in den temporären Buffer einlesen
  4. std::string aus dem Wert erstellen
  5. Temporären Buffer aufräumen

Hilfsfunktion zum Lesen eines NVS-Werts als std::string

Falls der Schlüssel nicht im NVS existiert, gibt diese Funktion einen leeren String ("") zurück.

read_nvs_to_stdstring.cpp
#include <nvs.h>
#include <string>

std::string ReadNVSValueAsStdString(nvs_handle_t nvs, const char* key) {
    /**
     * Strategie:
     *  1. Größe des Wertes im NVS ermitteln
     *  2. Temporären Buffer der ermittelten Größe zuweisen
     *  3. Wert aus NVS in temporären Buffer lesen
     *  4. std::string aus Wert erstellen
     *  5. Aufräumen
     */
    // Schritt 1: Größe des Schlüssels ermitteln
    esp_err_t err;
    size_t value_size = 0;
    if((err = nvs_get_str(nvs, _key.c_str(), nullptr, &value_size)) != ESP_OK) {
        if(err == ESP_ERR_NVS_NOT_FOUND) {
            // Nicht gefunden, kein Fehler
            return "";
        } else {
            printf("Failed to get size of NVS key %s: %s\r\n", key, esp_err_to_name(err));
            return;
        }
    }
    // Schritt 2: Temporären Buffer zum Lesen zuweisen
    char* buf = (char*)malloc(value_size);
    // Schritt 3: Wert in temporären Buffer lesen.
    esp_err_t err;
    if((err = nvs_get_str(nvs, _key.c_str(), buf, &value_size)) != ESP_OK) {
        // "Existiert nicht" wurde bereits vorher behandelt, dies ist also ein echter Fehler.
        // Wir nehmen an, dass sich der Wert zwischen dem Lesen der Größe (Schritt 1) und jetzt nicht geändert hat.
        // Falls diese Annahme zutrifft, schlägt dies mit ESP_ERR_NVS_INVALID_LENGTH fehl.
        // Dies ist jedoch in allen Verwendungsszenarien äußerst unwahrscheinlich.
        printf("Failed to read NVS key %s: %s\r\n", key, esp_err_to_name(err));
        free(buf);
        return "";
    }
    // Schritt 4: String erstellen
    std::string value = std::string(buf, value_size);
    // Schritt 5: Aufräumen
    free(buf);

    return value;
}

Verwendungsbeispiel

Dies setzt voraus, dass du myNvs eingerichtet hast, wie in unserem vorherigen Post NVS auf ESP32 initialisieren gezeigt.

example_usage.cpp
std::string value = ReadNVSValueAsStdString(myNvs, "MyKey");

C++17-Optimierungen

Ab C++17 kannst du möglicherweise einen std::string direkt erstellen, anstatt den temporären Buffer zu verwenden, da es eine Überladung von .data() gibt, die einen nicht-const-Zeiger zurückgibt – sodass du direkt in den Buffer des std::string schreiben kannst.

Da meine PlatformIO-basierte Toolchain dies jedoch derzeit nicht unterstützt, habe ich diesen Code noch nicht geschrieben.


Ähnliche Beiträge nach Kategorie: C/C++, ESP8266/ESP32