3

uart ポートにリダイレクトされる newlib の printf 関数に奇妙な問題があります。

この問題は、例を使ってうまく説明できます。

printf(" hi ");
... 
...//some other simple code. like a++; 
...
printf(" hello ");

プログラムを実行すると、次のprintfに到達/呼び出されるまで「hi」は表示されません。つまり、'hello' が出力されることになっている場合、'hi' が出力されます.. この 1 呼び出しの遅延は常に実行されます。最後のprintfはまったく印刷されません。

私のUARTコードはどこですか:

int write(int file, char *ptr, int len) {
unsigned int i;
int de =1;
//initialize_Uart(de);// NOT REQUIRED as UBOOT has already done the job.

    /* Transmitting a char from UART */
    for (i = 0; i < len; ++i, ++ptr)
    {
        while (!(IN_8(DUART1_ULSR1)&(0x20))); // wait for the CTS bit is cleared
                OUT_8(DUART1_UTHR, *ptr);

    }
return len;
}

これに対する解決策は何ですか?

4

3 に答える 3

3

stdoutストリームへの出力 ( など) はデフォルトでbufferedであることを覚えておく必要があります。

を呼び出して明示的に、fflush(stdout)または表示するテキストに改行を追加して半明示的に (たとえばprintf(" hi \n");)、またはバッファーがいっぱいになり、ライブラリによってフラッシュされるように十分に書き込むことによって暗黙的に、バッファーがフラッシュされるまで、何も書き込まれません。

于 2013-12-18T14:07:38.317 に答える
3

通常、標準出力はバッファリングされます。通常、改行文字が検出されると、バッファーがフラッシュされるか、バッファーがいっぱいになると、部分的なデータしか表示されない場合があります。

次のいずれかを行うことで、自分でフラッシュを強制できます

printf("\n");  <- Note the newline which should be present in your output.

使用して

fflush(stdout);

または、バッファを に設定してバッファ サイズを変更することもできますNULL。これにより、標準出力がすぐに書き込まれます。

setbuf(stdout, NULL);
于 2013-12-18T14:09:28.923 に答える