硬汉嵌入式论坛

 找回密码
 立即注册
查看: 344|回复: 2
收起左侧

[其它] 关于GCC编译器的printf问题求解答

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2025-11-3 21:13:33 | 显示全部楼层 |阅读模式
本帖最后由 Surfing 于 2025-11-3 21:18 编辑

我使用cmake构建V6板子的标准库工程时发现了一个问题(这个问题在HAL库工程中也复现了)
在串口发送时,当我使用如图上面的printf方式时无法发送,而使用buf+sprintf+comgSendBuf却能成功发送

两种发送方式

两种发送方式


在本工程中,我使用了syscalls.c文件,并将__putchar进行重定义,使其调用comSendChar

__putchar的重定向

__putchar的重定向

经过不断尝试,我发现这个问题是由发送的字符串中没有\n引起的
在这种环境中,printf只有遇到\n时才会输出,并且会将之前调用printf没有输出的内容一起输出
我曾经认为printf和sprintf之后发送是一样的效果,现在看来他们还是有些不同,不知道有没有大佬能为我讲解一下





下面是我的一些尝试
我把__putchar重定义为把字符放入一个buffer,如果是printf("count = %6d \r", count);,完全不会进行放入操作,也没有进入syscalls.c中的_write函数

新的重定义

新的重定义

__write函数

__write函数


改成printf("count = %6d \n\r", count);第一次放入的数据没有\r,之后的每一次的数据都是\r在开头,以\n结尾

buffer存入情况

buffer存入情况


如果是\r\n结尾的话就是正常放入,事情好像有头绪了,下面的测试让我得到了结论

最终测试

最终测试



按下Key1,Key2,Key2后的输出完全与预想中的一致

最终输出

最终输出





回复

使用道具 举报

8

主题

28

回帖

57

积分

初级会员

积分
57
发表于 2025-11-4 08:29:10 | 显示全部楼层
缓冲的问题,默认是到\n才输出,可以强制flush
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 2025-11-5 10:31:10 | 显示全部楼层
标准输出通常有三种缓冲模式:
全缓冲(Fully Buffered):当缓冲区被填满时,才会进行刷新。这通常用于输出到文件的情况。
行缓冲(Line Buffered):当遇到换行符 \n 时,缓冲区会被刷新。这是 连接到交互式终端(如你的命令行窗口)时的默认模式。
无缓冲(Unbuffered):数据立即输出,不经过缓冲区。标准错误(stderr)默认就是无缓冲的,以确保错误信息能第一时间被看到。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-21 20:52 , Processed in 0.039565 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表