Перейти к содержанию
    

Не сложный вопрос по FatFS

Имеется ситуация, что нужно в файле писать каждый параметр с новой строки...

 

Проделываю следующую последовательность операций:

 

1. f_open(...) - открыл файл

2. f_lseek(...) - перешел в конец файла

3. f_write(...) - записал новую строку

 

На деле f_lseek получает правильное значение указателя конца файла, но запись строки происходит с нулевого байта файла и тем самым просто затираются старые данные и записываются новые...Что я не учел?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На деле f_lseek получает правильное значение указателя конца файла, но запись строки происходит с нулевого байта файла и тем самым просто затираются старые данные и записываются новые...Что я не учел?

Код приведите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот собственно

 

FIL dataFile;

f_open(&dataFile,"1.txt",FA_OPEN_ALWAYS|FA_WRITE);

f_lseek(&dataFile, dataFile.fsize);

f_write(&dataFile,&str,strlen(str),&writen);

Значение fsize вывожу в терминал, оно совпадает с тем что есть внутри файла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Последовательность правильная, видимо дело в чём-то другом.

Вот для примера мой рабочий код:

bool logfile_t::do_flush()
{
    FRESULT res;

    // open file for writing
    if ((res = f_open(&fi_, filename_, FA_WRITE | FA_OPEN_ALWAYS)))
    {
        f_close(&fi_);
        uart << "\r\n logfile_t::flush: error opening log file " << filename_ << ", code = " << res;
        return false;
    }

    // Move to end of the file to append data
    if ((res = f_lseek(&fi_, fi_.fsize)))
    {
        f_close(&fi_);
        uart << "\r\nlogfile_t::flush: log file error while f_lseek, code = "<< res;
        return false;
    }

    UINT written;
    res = f_write(&fi_, buf_, count, &written);
    f_close(&fi_);
    if (res)
    {
        uart << "\r\nlogfile_t::flush: f_write error = " << res;
        return false;
    }
    if (written < count)
    {
        uart << "\r\nlogfile_t::flush: written (" << written << ") < count";
        return false;
    }
    return true;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверьте возвращаемое значение функции lseek(). Оно должно быть равно нулю.

 

Также, в случае успешного завершения lseek() значение dataFile.fptr должно быть равно требуемому dataFile.fsize.

 

ЗЫ: не используется ли, случайно, фича _USE_FASTSEEK?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

lseek() возвращает стабильно 0.

dataFile.fptr = dataFile.fsize

 

Это я сразу стал смотреть как столкнулся с проблемой.

 

ЗЫ: не используется ли, случайно, фича _USE_FASTSEEK?

Нет, выключена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно, глюк в драйвере диска.

Продебажте по шагам позиционирование\запись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Была некоторая пауза...Снова взялся за копание кода.

 

Последовательность

f_open(...);

f_lseek(...);

f_write(...);

f_close(...);

 

Заменил на

f_open(...);

f_lseek(...);

f_write(...);

f_sync(...);

 

Результат стал получаться, т.е. информация в файл дописывается, но возникла другая проблема:

записываемый текст совершенно не то что должно быть. Сконфигурирована кодировка Win1251, а в файле полная абракадабра, которая не подходит ни под одну кодировку. Записываю одно и тоже слово, а абракадабра постоянно разная...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

писать каждый параметр с новой строки...

Есть же функция записать строку. Почему её не используйте?

В таблице конверсии Win1251 ошибка толи с буквой 'Я' толи с 'Ы'

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Честно говоря даже и не подумал насчет этой функции, записи строки, попробую.

А насчет конверсии - я пишу латинскими буквами.

 

Что-то странное в этом есть...

Пишу следующую строку:

 

f_puts("proverka na zapis'\r\n",&dataFile);

 

Повторяю строку N количество раз и в файле же вижу:

test

 

sU„

e3T

У–°ЧџhЯfDы‰ґuLU‰С‹qҐњшЬ–ѕ&кz°ihв7ґ<MЁк¤»к«чуыхё/|ЊY<МЈќlЋГ­і7з›mч”zbм-ъiІiАзХЃ-mП“ЎпПюяњэи2Кщ§‚йМ9ЗcіьиT›цй«'ылTЬSБньф»п!G/wo‹“ Юoo+хьuЖР

Чем большее количество раз повторяю N, тем больше белиберды в файле...

 

Отдельно скажу насчет первого слова "test" это слово я записывал еще в начале опытов с файловой системой, после этого несколько раз форматировал карточку.

И теперь при каждом создании файла и записи оно сам по себе проявляется, а нужные слова не пишутся, цифры к слову тоже не пишутся...

Все функции работают нормально, возвращают стабильно 0.

 

Толи я в лыжи обут...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Идет следующая последовательность строк:

 

1. f_open(&dataFile,"log.txt",FA_OPEN_ALWAYS|FA_WRITE);
- Открыл файл, если его нет, то создаю.

2. f_lseek(&dataFile,dataFile.fsize);
- Задал указателю точку конца файла.

 

Но вот в чем проблема к строчке №2 значение dataFile.fsize держится в 0 и потому каждая последующая строка всегда начинает записываться с позиции 0, вместо дописывания к концовке файла.

 

Между строками 1 и 2 нужно что-то дополнительно делать или может пауза нужна какая-то?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Между строками 1 и 2 нужно что-то дополнительно делать или может пауза нужна какая-то?

Я же вам в посте №4 привёл рабочую последовательность. Нужно проверять в первую очередь не dataFile.fsize, а результаты вызова функций. Если же и там всё в порядке, то проблема скорее всего не в FatFS, а в её кривом портировании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Учитывая, что FatFS очень распространена и повсеместно работоспособна, скорее всего дело в реализации функций чтения/записи, реализация которых лежит всецело на разработчике.

 

Думается, что проблема именно в функции записи. Потому как, если бы чтение не работало, сразу же повалились бы ошибки при diskinitialize(n) и диск не монтировался бы в принципе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я же вам в посте №4 привёл рабочую последовательность. Нужно проверять в первую очередь не dataFile.fsize, а результаты вызова функций. Если же и там всё в порядке, то проблема скорее всего не в FatFS, а в её кривом портировании.

Результаты вызовов функций - 0, т.е. все в порядке...

Ваша последовательность ничем в общем-то особо и не отличается от примеров от Chan'а...

Что касательно dataFile.fsize, когда я в строке

f_lseek(&dataFile,dataFile.fsize);
вручную задаю точку указателя, то у меня все записывается как надо, с указанного места, но мне надо чтобы функция сама устанавливалась в конец файла и дописывала его.

После открытия файла вывожу в терминал значение dataFile.fsize и оно нулевое...в итоге указатель постоянно устанавливается в нулевую позицию и строки вместо того чтобы дописываться в файл - затирают друг друга.

Изобретать костыль не есть гуд, надо понять почему происходит затык.

 

Думается, что проблема именно в функции записи. Потому как, если бы чтение не работало, сразу же повалились бы ошибки при diskinitialize(n) и диск не монтировался бы в принципе.

Функция записи работает. Инициализация работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После открытия файла вывожу в терминал значение dataFile.fsize и оно нулевое...

Замените атрибут FA_OPEN_ALWAYS на FA_OPEN_EXISTING.

Сделайте объект dataFile статическим - static FIL dataFile;

 

Проверьте результат, fsize всё так же после открытия файла будет равен нулю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...