Ошибка ассемблера при использовании f_printf из fatfs, но f_write работает нормально - PullRequest
1 голос
/ 19 февраля 2020

У меня есть небольшой фрагмент кода, который открывает файл, читает одно число, добавляет его и записывает обратно в файл. Он отлично работает, когда я использую f_write, но f_open возвращает FR_INT_ERR. Я использую версию R0.12 c. Код, который генерирует ошибку:

FIL indexFile;
char chars[10] = {0};
uint16_t indexNumber = 0;
FRESULT fr;
fr = f_open(&indexFile, INDEX_NAME, FA_READ | FA_WRITE | FA_OPEN_EXISTING);
fr = f_read(&indexFile, &chars, 10, &br);
indexNumber = atoi(chars);
fr = f_lseek(&indexFile, 0);
fr = f_printf(&indexFile, "%d", indexNumber+1);  // produces assertion error
if (fr != FR_OK) printf("Something went wrong");

Но если я изменю fr = f_printf(&indexFile, "%d", indexNumber+1); на следующее, он не будет жаловаться:

char stringBuffer[5];
sprintf(stringBuffer, "%d", indexNumber+1);
UINT bw;
fr = f_write(&indexFile, stringBuffer, strlen(stringBuffer), &bw);
if (fr != FR_OK || strlen(stringBuffer) != bw) printf("something went wrong");

Хотя я могу продолжать использовать второй подход, но я Я тот человек, который должен понимать, что не так.

Кстати: я использую STM32

1 Ответ

2 голосов
/ 19 февраля 2020

Я считаю, что f_write действительно возвращает FRESULT, но f_printf возвращает int, указывающее количество написанных символов. Поэтому проверка на F_OK в качестве возврата не имеет смысла. Вместо этого вам нужно утверждать, основываясь на строке входного формата,

Редактировать: в соответствии с комментарием @KamilCuk, EOF (-1) будет возвращено при неудаче, поэтому проверьте это.

...