logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Arduino IDE ESP8266 SD.h – tryby otwarcia pliku WRITE, READ, APPEND – niejasności działania

zbynio_k 30 Sie 2025 16:04 2457 10
REKLAMA
  • #1 21648743
    zbynio_k
    Poziom 10  
    Posty: 169
    Ocena: 2
    Witam,
    pacjent - Arduino IDE, esp8266, karta SD, biblioteka SD.h, operacje na pliku (tekstowym)
    czy ktoś może mi wyjaśnić takie zachowanie biblioteki?
    1. otwarcie pliku w trybie WRITE powoduje dodanie wiersza do pliku, a nie NADPISANIE
    2. tak samo jak przy otwarciu { FILE_WRITE | O_APPEND }
    3. po otwarciu pliku WRITE, wykonaniu operacji i zamknięciu pliku - dataFile.close();
    próba ponownego otwarcia kończy się błędem
    4. po otwarciu pliku WRITE, można zarówno zapisywać dane, jak i odczytywać
    składnia - File dataFile = SD.open(plik1, FILE_WRITE);

    każda "normalna" biblioteka (np. w Delphi)
    rozróżnia tryby otwarcia pliku WRITE, READ i APPEND

    czy ja robię błąd myślowy, czy po prostu ta biblioteka tak działa?
  • REKLAMA
  • #2 21648757
    inot
    Poziom 38  
    Posty: 3551
    Pomógł: 439
    Ocena: 798
    Poczytaj na ten temat:
    Link
  • #3 21648778
    zbynio_k
    Poziom 10  
    Posty: 169
    Ocena: 2
    Dziękuję,
    po pobieżnym przejrzeniu
    nie wykorzystuję SD.h, tylko jakiś Fat czy PetiteFat z biblioteki FS.h
  • REKLAMA
  • #4 21648790
    inot
    Poziom 38  
    Posty: 3551
    Pomógł: 439
    Ocena: 798
    Faktycznie tak.
  • #5 21649080
    zbynio_k
    Poziom 10  
    Posty: 169
    Ocena: 2
    No, niestety tak to nie działa,
    nie kompiluje, mimo że powinna być kompatybilność w dół
    zainstalowałem ESP32 board > nie kompiluje nawet po wybraniu ESP32 board
    ESP Espressif'a nie chce się zainstalować
    dziękuję za zainteresowanie
  • REKLAMA
  • #6 21649115
    inot
    Poziom 38  
    Posty: 3551
    Pomógł: 439
    Ocena: 798
    Mogę zobaczyć na moim starym komputerze, jak to kiedyś rozwiązałem. O ile sobie dobrze przypominam, to problemy były z różnymi wersjami Arduino Core.

    Sprawdziłem działający program.
    Faktycznie tryb APPEND nie funkcjonował, dlatego też użyłem poniższego kodu:
    Kod: Arduino
    Zaloguj się, aby zobaczyć kod
  • #7 21649519
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1460
    zbynio_k napisał:
    No, niestety tak to nie działa,
    nie kompiluje, mimo że powinna być kompatybilność w dół


    Gratujemy jednoznacznego zamieszczenia kodu i komunikatu kompilatora.
  • REKLAMA
  • #8 21650774
    zbynio_k
    Poziom 10  
    Posty: 169
    Ocena: 2
    inot napisał:
    Mogę zobaczyć na moim starym komputerze, jak to kiedyś rozwiązałem. O ile sobie dobrze przypominam, to problemy były z różnymi wersjami Arduino Core.

    Sprawdziłem działający program.
    Faktycznie tryb APPEND nie funkcjonował, dlatego też użyłem poniższego kodu:
    Kod: Arduino
    Zaloguj się, aby zobaczyć kod


    tak, zamiast APPEND działa seek(EOF)
    ale SD.open(nazwa, FILE_WRITE) też działa jak APPEND
    niestety w bibliotece SD.h trzeba usunąć plik i stworzyć go na nowo

    dziękuję za zainteresowanie
  • #9 21650834
    inot
    Poziom 38  
    Posty: 3551
    Pomógł: 439
    Ocena: 798
    zbynio_k napisał:
    w bibliotece SD.h trzeba usunąć plik i stworzyć go na nowo

    Dlaczego?
    Za pomocą kodu podanego powyżej nie musisz się zastanawiać, czy otwarty jest nowy plik, albo już istniejący. Zawsze skaczesz na koniec pliku (w przypadku nowego pliku to początek) i możesz dalej zapisywać. Działa stuprocentowo.
  • #10 21651400
    zbynio_k
    Poziom 10  
    Posty: 169
    Ocena: 2
    niestety NIE
    po wykonaniu seek(0) "kursor" istotnie ustawia się na początek pliku, gdzie zapisuje dane, ale te, które były pozostają
    sprawdzane parę razy
  • #11 21651414
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1460
    @zbynio_k nie rozumiesz o czym mówi kol @inot
    Uparcie mówisz o SWOJEJ wizji z seek(), i takie działanie seek() jest prawidłowe, nie ma cichego "trunc"

Podsumowanie tematu

✨ Dyskusja dotyczy zachowania biblioteki SD.h w środowisku Arduino IDE na platformie ESP8266 podczas operacji na plikach tekstowych na karcie SD. Zauważono, że otwarcie pliku w trybie FILE_WRITE nie powoduje nadpisania, lecz dodanie nowej linii, podobnie jak przy użyciu flagi O_APPEND. Po zamknięciu pliku wywołaniem dataFile.close() ponowna próba otwarcia pliku w trybie WRITE kończy się błędem. Dodatkowo, w trybie WRITE możliwe jest zarówno zapisywanie, jak i odczytywanie danych, co różni się od standardowego rozróżnienia trybów WRITE, READ i APPEND znanego z innych środowisk programistycznych (np. Delphi). Problem wynika z implementacji biblioteki SD.h dla ESP8266, która łączy funkcje zapisu i dopisywania oraz umożliwia odczyt w trybie zapisu, co może być mylące dla użytkowników przyzwyczajonych do klasycznych modeli dostępu do plików. Brak rozróżnienia trybów i specyficzne zachowanie otwarcia pliku wymaga uwzględnienia podczas programowania operacji na plikach w tym środowisku.
Wygenerowane przez model językowy.
REKLAMA