Newlib printf延迟

时间:2013-12-18 14:03:57

标签: c uart newlib

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

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

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

现在,当我运行程序时,'hi'直到那时才出现下一个printf到达/调用。 即,当打印'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;
}

这是什么解决方案?

3 个答案:

答案 0 :(得分:3)

您必须记住,输出到流(例如stdout)默认为缓冲

在刷新缓冲区之前没有写入任何内容,无论是通过调用fflush(stdout)显式地还是通过在您打印的文本中添加换行符(例如printf(" hi \n");)来显式地删除,或者通过写入足够的内容来隐式写入缓冲区填满并被库刷新。

答案 1 :(得分:2)

标准输出通常是缓冲的。通常,当遇到新行字符时,刷新缓冲区,或者当它变满时,您可能只看到部分数据。

您可以通过

强制自己冲洗
printf("\n");  <- Note the newline which should be present in your output.
使用

fflush(stdout);

或者您可以通过将缓冲区设置为NULL来更改缓冲区大小,这将导致标准输出被立即写入。

setbuf(stdout, NULL);

答案 2 :(得分:1)

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

刷新缓冲区