1

我是一名大学生,正在学习机器人技术的“入门”课程。今年年初,我们被告知要购买 Netburner 5270 板。这一年来,我们学习了一些基本代码,但现在我们的期末项目快到期了,但我遇到了一个错误。我的代码非常基本。我希望它首先检查按钮是否被按下,是否检查 dipswitch1 是否为高电平,如果是则打开 led1,打开伺服(开门),然后创建 - 写入字符串 - 并将文本文件关闭到我的SD卡。一切正常……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);

    }

** 我最近添加的两个 do while 循环是为了尝试重做调用,我不确定我是否写了那个写(这又是我的第一个编码课)

我的错误发生在 f_close 函数中。我将连续按下按钮 10 次,一切都会正常工作,但第 11 次我会得到错误,但第 12 次会再次工作?我的典型错误是: *任务期间 f_close("Enter.txt") 出错(主要);F_ERR_NOTOPEN

或者

*任务期间 f_close("Enter.txt") 出错(主要);F_ERR_WRITE

或者

*任务期间 f_close("Enter.txt") 出错(主要);F_ERR_NOTFORMATED

现在就像我说的那样,我并没有很多错误,但是当我这样做时,它就是这三个错误之一。我真的不知道发生了什么,甚至不知道如何尝试修复它。此代码正在 NBeclipse 上编写。如果有人有任何建议或提示,我将不胜感激。

4

1 回答 1

0

在以下代码中,您没有正确使用 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 次,这是不好的做法。

于 2012-12-27T16:35:14.577 回答