我对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;
}
这是什么解决方案?
答案 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()