Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32]FatFS problem z zapisem

14 Lut 2011 08:28 2751 4
  • Poziom 23  
    Cześć
    Mam problem z biblioteką FatFS. Inicjalizacja karty i odczyt działają bez zarzutów, problem zaczął się gdy próbowałem użyć funkcji f_write. W argumencie funkcji podaję wskaźnik do danych do zapisania, dane są zapisywane w pliku ale pierwsze 3 bajty zawsze mają wartość 0. Te 3 zera pojawiają się nie tylko w pliku ale i w pamięci pomimo że wskaźnik przekazywany do funkcji jest const.

    Code:

    diskOK=disk_initialize(0);
    pfat=&fat;
    diskOK+=f_mount(0,pfat);
    f_open(&file,"1.log",FA_OPEN_ALWAYS|FA_WRITE);

    //test   
    char tmp[15];
    unsigned char size,x;
    size=sprintf_(tmp,"Ala ma kota");
    print(tmp);//wywala dane na uarta - wszystko ok
    f_write(&file,tmp,size,&x);//funkcja zwraca sukces


    po wykonaniu f_write mamy w tmp 0,0,0,' ','m','a',' ','k'....itd i to samo jest w pliku. Może ktoś napotkał podobny problem ?
  • Poziom 33  
    A w funkcji print(); nie wykonujesz przypadkowo jakiś zapisów pod wskaźnik?
    Co jest w temp zaraz przed zapisem na kartę?
  • Poziom 23  
    Po sprintf zawartość tmp jest prawidłowa po print tak samo, dopiero f_write powoduje uszkodzenie danych.
  • Poziom 33  
    Code:
    FRESULT f_write (
    
       FIL *fp,         /* Pointer to the file object */
       const void *buff,   /* Pointer to the data to be written */
       UINT btw,         /* Number of bytes to write */
       UINT *bw         /* Pointer to number of bytes written */
    )
    {
       FRESULT res;
       DWORD clst, sect;
       UINT wcnt, cc;
       const BYTE *wbuff = buff;


       *bw = 0;

       res = validate(fp->fs, fp->id);               /* Check validity of the object */
       if (res != FR_OK) LEAVE_FF(fp->fs, res);
       if (fp->flag & FA__ERROR)                  /* Check abort flag */
          LEAVE_FF(fp->fs, FR_INT_ERR);
       if (!(fp->flag & FA_WRITE))                  /* Check access mode */
          LEAVE_FF(fp->fs, FR_DENIED);
       if (fp->fsize + btw < fp->fsize) btw = 0;      /* File size cannot reach 4GB */

       for ( ;  btw;                           /* Repeat until all data transferred */
       wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) {
    .......


    Ile w pierwszej iteracji wynosi wcnt ?
  • Poziom 10  
    Ostatnio często korzystam z FatFS ale na procku 2148 (pisze w C++ w Eclipse).
    Myśle że prawie na 100% powinna ta funkcja wygladać tak:
    Code:

    f_write(&file,tmp,sizeof(tmp),&x);

    poza tym zmienna "x" chyba powinna być typu unsigned int;
    przynajmniej u mnie tak to wyglada i zawsze jest oki