Skocz do zawartości

SPIFFS (esp32s3 idf)problem z utworzeniem i zapisem pliku


Pomocna odpowiedź

Napisano (edytowany)

Co poszło nie tak, że nie daje się utworzyć małego pliku konfiguracyjnego? 

    esp_vfs_spiffs_conf_t config = {
        .base_path = "/storage",
        .partition_label = NULL,
        .max_files = 5,
        .format_if_mount_failed = true
    };     
 
static esp_err_t load_or_create_modbus_config(modbus_config_t *config_out)
{
    // Zdefiniuj domyślną konfigurację jako punkt odniesienia
    const modbus_config_t default_settings = {
        .rtuaddr = 1,
        .rtubr = 115200, // Ustawmy tu inną wartość dla testu
        .rtutout = 1000,
        .rtuparity = 0,
        .rtustop = 1
    };

    // Krok 1: Spróbuj otworzyć istniejący plik
    FILE *f = fopen(modbus_rtu_config, "rb");

    if (f == NULL) {
        // Plik nie istnieje - to normalne przy pierwszym uruchomieniu
        ESP_LOGW(MEMTAG, "Plik konfiguracyjny '%s' nie istnieje. Tworzenie domyślnego.", modbus_rtu_config);
        
        // Użyj domyślnych ustawień
        *config_out = default_settings;

        uint8_t *cbor_buffer = NULL;
        size_t cbor_len = 0;
        if (serialize_modbus_config(&default_settings, &cbor_buffer, &cbor_len) != ESP_OK) {
            ESP_LOGE(MEMTAG, "Błąd krytyczny: nie można zserializować domyślnej konfiguracji!");
            return ESP_FAIL;
        }

        // Zapisz nowy plik
        FILE *fw = fopen(modbus_rtu_config, "wb");
        if (fw) {
            fwrite(cbor_buffer, 1, cbor_len, fw);
            fclose(fw);
        } else {
            ESP_LOGE(MEMTAG, "Nie udało się otworzyć pliku do zapisu!");
            free(cbor_buffer);
            return ESP_FAIL;
        }
        free(cbor_buffer);
        return ESP_OK;

Log wciąż wskazje że

W (363) SPIFFS: Plik konfiguracyjny '/storage/modbus_rtu_param.txt' nie istnieje. Tworzenie domyślnego.
I (373) MODBUS_CBOR: Serializacja do CBOR udana, rozmiar: 52
E (373) SPIFFS: Nie udało się otworzyć pliku do zapisu!
W (383) MAIN_APP: System uruchomiony z DOMYŚLNĄ konfiguracją z powodu błędu.

Natomiast późniejsza próba otworzenia tego pliku zwraca NULL. Może coś przeoczyłem? Partycja

# ESP-IDF Partition Table
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x6000,
phy_init, data, phy,     0xf000,  0x1000,
factory,  app,  factory, 0x10000, 1M,
storage,  data, spiffs,  0x110000,0x100000,

Cmake

set(EXTRA_COMPONENT_DIRS ${CMAKE_SOURCE_DIR}/components)
idf_component_register(SRCS "cborfnc.c" "bt_srv_task.c" "mb_rtu.c" "main.c"
                       INCLUDE_DIRS "."
                       REQUIRES "spiffs" "spi_flash" "bt" "nvs_flash" "esp_driver_gpio"
                     
                       PRIV_REQUIRES "nvs_storage" "DS3231"
                       )

# Dodaj źródła projektu
file(GLOB_RECURSE SOURCES
    ${CMAKE_SOURCE_DIR}/main/*.c
)                       # Dodaj foldery include

set(EXTRA_COMPONENT_DIRS components/tinycbor)
set(EXCLUDE_COMPONENTS freemodbus)
spiffs_create_partition_image(
storage ../ustawienia FLASH_IN_PROJECT)

 

Edytowano przez _LM_
(edytowany)

No, a montowanie partycji to psy zjadły 😄 

   esp_vfs_spiffs_conf_t config = {
        .base_path = "/storage",
        .partition_label = NULL,
        .max_files = 5,
        .format_if_mount_failed = true
    };     
 
    ret = esp_vfs_spiffs_register(&config);
    if(ret != ESP_OK)
    {
        ESP_LOGE(MEMTAG,"Nie udalo sie zarejestrowac partycji SPIFFS %s",esp_err_to_name(ret));
    }else{
        size_t total = 0,used = 0;    
        esp_spiffs_info(config.partition_label,&total,&used);
        ESP_LOGW(MEMTAG,"Partycja zainstalowana, total: %d zajete: %d",total,used);
    } 
   
  

 

Edytowano przez _LM_

@_LM_ miałem ostatnio podobny "problem" - plik po konwersji z utf-8 na iso-2 miał dokładnie zero bajtów. Po dłuższym wpatrywaniu się w kod załapałem, że close() może być przydatne 🙂

(edytowany)

Nie umiałem znaleźć błędu to wrzuciłem inicjalizację do czata gemini od googla, czasem się to przydaje 🙂

Co ciekawe wcześniej miałem to poprawnie napisane a podczas przenoszenia kodu do odrębnej funkcji wcięło instalowanie partycji

Edytowano przez _LM_

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...