首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Newlib打印延迟

Newlib打印延迟
EN

Stack Overflow用户
提问于 2013-12-18 14:03:56
回答 3查看 966关注 0票数 3

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

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

代码语言:javascript
复制
printf(" hi ");
... 
...//some other simple code. like a++; 
...
printf(" hello ");

现在,当我运行程序时,“hi”直到那时才会出现,然后到达/调用下一个printf。也就是说,当“hello”被打印出来时,它会打印“hi”,这个延迟的1次呼叫总是被承载。最后的打印文件根本就没有打印出来。

我的UART代码在哪里:

代码语言:javascript
复制
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;
}

解决这个问题的办法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-18 14:07:38

您必须记住,在默认情况下,流的输出(如stdout)是缓冲的。

除非缓冲区被刷新,否则不会写任何东西,要么是通过显式调用fflush(stdout),要么是通过在所打印的文本中添加一个换行符(例如printf(" hi \n");)而半显式地写入,或者通过写入足够多的内容来使缓冲区填满并被库刷新。

票数 3
EN

Stack Overflow用户

发布于 2013-12-18 14:09:28

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

你可以用任何一种方法来强迫自己脸红

代码语言:javascript
复制
printf("\n");  <- Note the newline which should be present in your output.

使用

代码语言:javascript
复制
fflush(stdout);

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

代码语言:javascript
复制
setbuf(stdout, NULL);
票数 3
EN

Stack Overflow用户

发布于 2013-12-18 14:10:45

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20660254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档