1

私はロボット工学の「入門」コースにいる大学生です。今年の初めに、Netburner 5270 ボードを購入するように言われました。1 年を通して、いくつかの基本的なコードを学びましたが、最終的なプロジェクトの期限が迫っていて、エラーが発生しています。私のコードはかなり基本的です。最初にプッシュボタンが押されているかどうかを確認し、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);

    }

** 2 つの do while ループは、呼び出しをやり直すために最近追加したものです。その書き込みを書いたかどうかはわかりません (これも私の最初のコーディング クラスです)。

私のエラーは f_close 関数内で発生します。プッシュボタンを 10 回連続で押すとすべてが機能しますが、11 回目はエラーが発生しますが、12 回目は再び機能しますか? 私の典型的なエラーは次のとおり です。F_ERR_NOTOPEN

また

*タスク (メイン) 中の f_close("Enter.txt") でエラーが発生しました。F_ERR_WRITE

また

*タスク (メイン) 中の f_close("Enter.txt") でエラーが発生しました。F_ERR_NOTFORMATED

私が言ったように、私は多くのエラーを取得しませんが、エラーが発生すると、それらの 3 つのうちの 1 つになります。何が起こっているのか、どうやって修正しようとしているのか、本当にわかりません。このコードは 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 回繰り返した後、ループを終了しました。各反復で「rv」が設定されるように、ループ内で f_close を呼び出す必要があります。それ以外の場合は、空のループを使用していました。

さらに、「i」は、再度使用する前に 0 に再初期化する必要があります。コードを完全な意味で見なくても、コードの先頭でファイルを開くときにエラーが発生した場合、「i」はすでに値 5 に設定されている可能性があることがわかります。値を 5 にして f_close ループをさらに 5 回実行するのは悪い習慣です。

于 2012-12-27T16:35:14.577 に答える