3

我对 newlib 的 printf 函数有一个奇怪的问题,它被重定向到 uart 端口。

这个问题可以用一个例子很好地解释。

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)默认情况下是缓冲的。

在刷新缓冲区之前,什么都不会写入,要么通过调用显式调用,要么通过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 回答
1

使用fflush(stdout); 通常缓冲存在于标准输入和输出中。您可以使用刷新缓冲区fflush()

于 2013-12-18T14:10:45.287 回答