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

Petit Fat, zapis do pliku *.txt, karta sd, atmega spi, c++

qutrit 06 Lis 2011 22:23 5429 14
REKLAMA
  • #1 10111049
    qutrit
    Poziom 20  
    Witam,
    Mam mały problem z biblioteką PetitFat mianowicie nie potrafię poradzić sobie z zapisem danych do pliku. Zapisuję tylko pierwszy sektor w pliku (liczyłem zapisane znaki, jest ich dokładnie 512) i nie umiem przejść do zapisu w drugim sektorze. Wiem, ze trzeba wykorzystać funkcję pf_lseek, ale nie potrafię jej użyć.
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Plik przed zapisem
    Petit Fat, zapis do pliku *.txt, karta sd, atmega spi, c++
    Plik po zapisie
    Petit Fat, zapis do pliku *.txt, karta sd, atmega spi, c++

    Przeczytałem sporo postów, zwłaszcza układów, w których dane akumulowane są na karcie sd, ale nikt nie napisał (nie udostępnił kodu) jak to zrobić.
    W paru postach przeczytałem również, ze jest możliwy zapis za pomocą PetitFat do pustego pliku :?: Ale to tak przy okazji, bardziej zależy mi na przejciu z zapisem do następnego sektora.
    Moze ktoś z forumowiczów wie jak to zrobić ? Pozdrawiam.
  • REKLAMA
  • Pomocny post
    #2 10111506
    nibbit
    Poziom 20  
    Petita nie używałem tylko fatfs ale patrząc na elm-chan:
    Cytat:
    File write operation must be done in following sequence.
    pf_lseek(ofs); read/write pointer must be moved to sector bundary prior to initiate write operation or it will be rounded-down to the sector boundary.
    pf_write(buff, btw, &bw); Initiate write operation. Write first data to the file.
    pf_write(buff, btw, &bw); Write next data. Any other file function cannot be used while a write operation is in progress.
    pf_write(0, 0, &bw); Finalize the write operation. If read/write pointer is not on the sector boundary, left bytes in the sector will be filled with zero.
    The read/write pointer in the file system object increases in number of bytes written. After the function succeeded, *BytesWritten should be checked to detect end of file. In case of *BytesWritten < ByteToWrite, it means the read/write pointer reached end of file during the write operation. Once a write operation is initiated, it must be finalized or the written data can be lost.

    to brakuje Ci tej ostatniej operacji.
  • Pomocny post
    #3 10111705
    markosik20
    Poziom 33  
    Jeżeli plik ma mniej jak 512B to nie zapiszesz nic ponad to.

    Cytat:
    Description

    The write function has some restrictions listed below:

    Cannot create file. Only existing file can be written.
    Cannot expand file size.
  • #4 10111970
    qutrit
    Poziom 20  
    plik po zapisie literek "z" ma 3kB
  • REKLAMA
  • Pomocny post
    #5 10112094
    drzasiek
    Specjalista CNC
    Jako argument pf_lseek dajesz liczbę, np :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A nie tak jak ty to robisz:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Poza tym musisz pamiętać, że petit fat nie powiększa rozmiaru pliku, więc nie możesz zapisać do pliku więcej bajtów, niż wynosił rozmiar pliku przed zapisem.
  • #6 10112112
    qutrit
    Poziom 20  
    Funkcję
    Kod: text
    Zaloguj się, aby zobaczyć kod

    przytoczyłem orginalną z projektu elm-chan

    Natomiast podobnie jak kolega sugeruje wstawiałem do niej rożne liczby i uzyskiwałem zmiany, ale w obrębie pierwszego sektora.
    Za nic nie mogę przejść do następnego sektora. Mimo, iż w moim przykładzie do zapisania jest 700 znaków, to zapisywanych jest zawsze tylko 512.
  • Pomocny post
    #7 10112132
    kriss68
    Poziom 20  
    Najpierw za pomocą pf_lseek musisz zarezerwować odpowiednio duży rozmiar pliku potem wracasz na początek pliku (pf_lseek(0)) zapisujesz co trzeba i kończysz zapis pf_write(0,0,&s1);
  • #8 10112186
    qutrit
    Poziom 20  
    :arrow:kriss68 To jest pomysł całkiem rozsądny :)
    Na razie jestem w pracy, sprawdzę praktycznie jak wrócę. Oczywiście mam nadzieję, ze będzie możliwość dopisywania do pliku kolejnych danych. Ale teoretycznie wyglądałoby to tak ?
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #9 10112198
    kriss68
    Poziom 20  
    Ale zarezerwować musisz po otwarciu pliku a nie przed
  • REKLAMA
  • Pomocny post
    #10 10112508
    michalko12
    Specjalista - Mikrokontrolery
    kriss68 napisał:

    Najpierw za pomocą pf_lseek musisz zarezerwować odpowiednio duży rozmiar pliku potem wracasz na początek pliku (pf_lseek(0)) zapisujesz co trzeba i kończysz zapis pf_write(0,0,&s1);

    A skąd posiadasz takie informacje? Co to według ciebie oznacza "zarezerwować odpowiednio duży rozmiar pliku"?


    Funkcją pf_lseek(ofs) możesz przesuwać wskaźnik zapisu tylko na początek sektora czyli modulo 512 bajtów. Jeśli przesuniesz wskaźnik np do 600 bajtu to następny zapis będzie od dolnej granicy sektora czyli od 512 bajtu.
    Argumentem funkcji pf_lseek(ofs) jest offset od początku pliku, a nie od aktualnej pozycji.

    Nie jestem do końca pewny, ale pf_lseek(ofs) można używać dopiero po "zamknięciu" zapisu funkcją pf_write(0,0,&bw);
  • REKLAMA
  • Pomocny post
    #11 10112699
    kriss68
    Poziom 20  
    A stąd, że funkcja zapisująca nie jest w stanie zwiększyć rozmiaru pliku a lseek alokuje odpowiednią ilość sektorów więc też zwiększa rozmiar pliku i liczbę danych które możemy zapisać (jest to w opisie seek'a dla fat fs'a, a opis dla petita temu nie przeczy) ;) a dodatkowo to co napisałem nie przeczy temu, że lseek używa offsetu od początku pliku.
  • Pomocny post
    #12 10112726
    michalko12
    Specjalista - Mikrokontrolery
    Petit Fat w żaden sposób nie powiększa rozmiaru pliku, po prostu nie modyfikuje tablicy FAT.
  • Pomocny post
    #13 10112748
    kriss68
    Poziom 20  
    Masz rację (zasugerowałem się opisem seek'a od fatfs'a zapominajac, ze petit nie rusza tablicy fat) w końcu petit nie nadaje się za bardzo do zapisu danych a prędzej do odczytu w końcu nie można w nim nawet utworzyć pliku. Dlatego proponował bym jeśli masz na tyle miejsca w pamięci przesiąść się na FatFs'a. Chociaż twój plik niby ma rozmiar większy niż te 512 bajty wiec problem leży gdzie indziej. Spróbuj dodać to pf_write(0,0,&s1); bo zapewne nie zapisuje Ci tego ostatniego sektora bo nie uzbierał 512 bajtów
  • #14 10119465
    qutrit
    Poziom 20  
    Witam, dzięki za liczne odpowiedzi.
    Próbowałem chyba na wszystkie sposoby wstawiać, zarówno:
    Kod: text
    Zaloguj się, aby zobaczyć kod
    z argumentem równym wielokrotności sektora i nie tylko.
    jak również:
    Kod: text
    Zaloguj się, aby zobaczyć kod
    ale jeżeli użyłem tylko tej funkcji jako zamknięcie zapisu tj. bez funkcji
    Kod: text
    Zaloguj się, aby zobaczyć kod
    to nic się nie zapisywało.

    Powoli się przekonywuję, ze jednak, jak było to wspomniane, petitfat sprawdza się dobrze przy odczycie plików, a nie zapisie informacji do nich. Spróbuję z FatFs-może uda mi się go uruchomić, ale jeśli będą jakieś pomysły do PetitFs, to z chęcią je wypróbuje.
  • #15 10121238
    kriss68
    Poziom 20  
    Jak byś miał jakieś problemy z FatFs to napisz do mnie na gg, chętnie pomogę.
REKLAMA