Comment lire une valeur NVS ESP32 dans std::string
Dans notre post précédent, nous avons discuté de Comment obtenir la longueur / taille d’une valeur NVS sur ESP32. Sur cette base, nous pouvons lire une valeur NVS dans un std::string.
Stratégie
- Déterminer la taille de la valeur dans le NVS
- Allouer un buffer temporaire de la taille déterminée
- Lire la valeur depuis le NVS dans le buffer temporaire
- Créer le
std::stringdepuis la valeur - Nettoyer le buffer temporaire
Fonction utilitaire pour lire une valeur NVS comme std::string
Au cas où la clé n’existe pas dans le NVS, cette fonction retournera la chaîne vide ("").
#include <nvs.h>
#include <string>
std::string ReadNVSValueAsStdString(nvs_handle_t nvs, const char* key) {
/**
* Stratégie :
* 1. Déterminer la taille de la valeur dans le NVS
* 2. Allouer un buffer temporaire de la taille déterminée
* 3. Lire la valeur depuis le NVS dans le buffer temporaire
* 4. Créer le std::string depuis la valeur
* 5. Nettoyer
*/
// Étape 1 : Obtenir la taille de la clé
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) {
// Non trouvé, pas d'erreur
return "";
} else {
printf("Échec de l'obtention de la taille de la clé NVS %s : %s\r\n", key, esp_err_to_name(err));
return;
}
}
// Étape 2 : Allouer un buffer temporaire pour lire depuis
char* buf = (char*)malloc(value_size);
// Étape 3 : Lire la valeur dans le buffer temporaire.
esp_err_t err;
if((err = nvs_get_str(nvs, _key.c_str(), buf, &value_size)) != ESP_OK) {
// "N'existe pas" a déjà été géré avant, donc c'est une erreur réelle.
// Nous supposons que la valeur n'a pas changé entre la lecture de la taille (étape 1) et maintenant.
// Au cas où cette supposition est valide, ceci échouera avec ESP_ERR_NVS_INVALID_LENGTH.
// Ceci est cependant extrêmement improbable dans tous les scénarios d'utilisation.
printf("Échec de la lecture de la clé NVS %s : %s\r\n", key, esp_err_to_name(err));
free(buf);
return "";
}
// Étape 4 : Créer la chaîne
std::string value = std::string(buf, value_size);
// Étape 5 : nettoyage
free(buf);
return value;
}Exemple d’utilisation
Ceci suppose que vous avez configuré myNvs comme nous l’avons montré dans notre post précédent Comment initialiser le NVS sur ESP32
std::string value = ReadNVSValueAsStdString(myNvs, "MyKey");Optimisations C++17
À partir de C++17, vous pouvez possiblement créer un std::string directement au lieu d’utiliser le buffer temporaire, puisqu’il y a une surcharge de .data() qui retourne un pointeur non-const - donc vous pouvez écrire directement dans le buffer du std::string.
Cependant, puisque ma chaîne d’outils basée sur PlatformIO ne supporte actuellement pas cela, je n’ai pas encore écrit ce code.