Ошибка с f_close (запись на SD карту моего финального проекта)

Я студент колледжа по курсу «вводный курс» по робототехнике. В начале года нам сказали купить плату Netburner 5270. В течение года мы изучали некоторые базовые коды, но теперь наш окончательный проект почти готов, и у меня возникла ошибка.
Мой код довольно простой. Я хочу, чтобы он сначала проверил, нажата ли кнопка, если он проверяет, высокий ли уровень dipswitch1, затем включите led1, включите серво (открыть дверь) и создайте-напишите строку — и закройте текстовый файл на моем компьютере. SD Card. Все работает … 70% времени.

Это функция, которая должна делать все, что мне нужно для моей SD-карты

    void Enter_Door(char * FileName) {
iprintf("\r\nCreating file: %s\r\n", FileName);
int i = 0;
F_FILE* fp;
do {
fp = f_open( FileName, "a+" ); // Creating and Opening File
i++;
if (fp == 0) { /// Does NOT open
OSTimeDly(TICKS_PER_SECOND / 2);
}
} while (fp == 0 && i < 5);
if (fp == 0) {
iprintf("\r\n Error in Opening:%s\r\n", FileName);
} else {

const unsigned int write_buffer_size = 100;
char write_buf[write_buffer_size];
sniprintf(write_buf, write_buffer_size, "Person Entered at %ld seconds\r\n", Secs);
int n = f_write( write_buf, 1, strlen( write_buf ), fp );
iprintf("Wrote %d bytes: %s", n, write_buf);

iprintf("Closing file %s\r\n\r\n", FileName);

int rv = f_close( fp ); // Close a previously opened file of type F_FILE
do {
i++;
if (rv != 0) { /// Does NOT open
OSTimeDly(TICKS_PER_SECOND / 2);
}
} while (rv != 0 && i > 10);
if (rv != 0) {
f_close_PrintError(FileName);

DisplayEffsErrorCode(rv);

}

** эти две функции делают циклы while, которые я недавно добавил, чтобы попытаться повторить вызов, я не уверен, написал ли я эту запись (опять же, это мой первый класс кодирования)

Моя ошибка происходит в функции f_close. Я нажму кнопку 10 раз подряд, и все будет работать, но в 11-й раз я получу и ошибку, а в 12-й раз она снова заработает? Мои типичные ошибки:
* Ошибка в f_close («Enter.txt») во время выполнения задачи (Main);
F_ERR_NOTOPEN

или же

* Ошибка в f_close («Enter.txt») во время выполнения задачи (Main);
F_ERR_WRITE

или же

* Ошибка в f_close («Enter.txt») во время выполнения задачи (Main);
F_ERR_NOTFORMATED

Теперь, как я уже сказал, я не получаю много ошибок, но когда я это делаю, это один из этих трех. Я действительно не знаю, что происходит или как даже попытаться это исправить. Этот код пишется на NBeclipse. Если у кого-то есть какие-либо предложения или советы, я был бы очень признателен.

1

Решение

В следующем коде вы неправильно используете f_close:

    int rv = f_close( fp ); // Close a previously opened file of type F_FILE
do {
i++;
if (rv != 0) { /// Does NOT open
OSTimeDly(TICKS_PER_SECOND / 2);
}
} while (rv != 0 && i > 10);

Попробуйте вместо этого добавить в цикл f_close:

    int rv;
i = 0;
do {
rv = f_close( fp ); // Close a previously opened file of type F_FILE
if (rv != 0)  /// Does NOT open
OSTimeDly(TICKS_PER_SECOND / 2);
i++;
} while (rv != 0 && i > 10);

Я не знаю, поможет ли это конкретно решить вашу проблему, но, глядя на ваш код, вы вызывали f_close и устанавливали для ‘rv’ возвращаемое значение этой функции, прежде чем вы зациклились. Оказавшись в цикле, вы увеличивали «i», а затем проверяли значение «rv». Это повторилось 10 раз и затем вышло из цикла. Вам нужно вызвать f_close внутри цикла, чтобы на каждой итерации устанавливалось значение rv. В противном случае вы просто использовали пустой цикл.

Кроме того, «i» необходимо повторно инициализировать на 0, прежде чем использовать его снова. Не глядя на ваш код в полном смысле этого слова, я вижу, что если при открытии файла в верхней части вашего кода возникла ошибка, возможно, для «i» уже может быть установлено значение 5. Если только вы не намеревались начать значение в 5 и запустить через цикл f_close еще 5 раз, это плохая практика.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]