硬汉嵌入式论坛

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

[有问必答] STM32 printf疑难杂症请教

[复制链接]

6

主题

28

回帖

46

积分

新手上路

积分
46
发表于 2025-2-22 07:23:38 | 显示全部楼层 |阅读模式
我在使用printf打印eeprom数据时遇到了printf输出被截断的问题,当printf打印到%s部分时就会不输出,变成空白,但是当在前面添加一个printf打印字符输出时,下面就会正常,而且下面一句printf的%s部分的输出与上面printf输出的字符数量有关,不知道这是什么问题
1.png
2.png
3.png

前面添加printf后就会正常

前面添加printf后就会正常
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2025-2-22 10:02:58 | 显示全部楼层
sizeof test改成用strlen test
回复

使用道具 举报

6

主题

28

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2025-2-22 21:25:20 | 显示全部楼层
eric2013 发表于 2025-2-22 10:02
sizeof test改成用strlen test

改用strlen也没变化呢,长度改成20也是一样
回复

使用道具 举报

6

主题

28

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2025-2-22 21:44:11 | 显示全部楼层
eric2013 发表于 2025-2-22 10:02
sizeof test改成用strlen test

改用HAL_UART_Transmit就输出正常了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2025-2-23 06:22:59 | 显示全部楼层
国产娃娃菜 发表于 2025-2-22 21:44
改用HAL_UART_Transmit就输出正常了

别的问题看不出来了。
回复

使用道具 举报

97

主题

537

回帖

843

积分

金牌会员

积分
843
发表于 2025-2-23 19:10:34 | 显示全部楼层
本帖最后由 会飞的猪_2020 于 2025-2-23 19:14 编辑

搞干净一点的环境单纯测printf。
直接让它输出一个写死的数据,不用EEPROM_Read

我怀疑你读到的buff不正确,是不是前面有\0之类的。
共产主义一定胜利!
回复

使用道具 举报

6

主题

28

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2025-2-23 22:06:39 | 显示全部楼层
会飞的猪_2020 发表于 2025-2-23 19:10
搞干净一点的环境单纯测printf。
直接让它输出一个写死的数据,不用EEPROM_Read

写死的数据能printf出来,用for遍历单个字符也没问题,就是直接输出字符串有问题
回复

使用道具 举报

0

主题

9

回帖

9

积分

新手上路

积分
9
发表于 2025-2-24 10:13:25 | 显示全部楼层
调试查看一下buf读出来的内容,估计可能第一个字符是“\0",导致printf认为读到字符串结尾了,然后就截断了。
回复

使用道具 举报

24

主题

196

回帖

268

积分

高级会员

积分
268
QQ
发表于 2025-2-24 11:20:47 | 显示全部楼层
用自己实现的 printf 试试?更加可调试可控。

https://github.com/mpaland/printf
回复

使用道具 举报

6

主题

28

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2025-2-24 19:56:11 | 显示全部楼层
yono 发表于 2025-2-24 11:20
用自己实现的 printf 试试?更加可调试可控。

https://github.com/mpaland/printf

谢谢哥的分享,完美解决了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2025-2-25 05:01:10 | 显示全部楼层
国产娃娃菜 发表于 2025-2-24 19:56
谢谢哥的分享,完美解决了

如果这样可以解决,且你说的错行发送了,这个是你上位机软件帧结束超时判断问题。
回复

使用道具 举报

24

主题

196

回帖

268

积分

高级会员

积分
268
QQ
发表于 2025-2-25 09:50:10 | 显示全部楼层
国产娃娃菜 发表于 2025-2-24 19:56
谢谢哥的分享,完美解决了



如果是只是简单替换成私有 printf 就解决了的话,大概是 microLib 的 printf 实现有什么问题吧。
个人建议是尽量少用标准库的复杂功能,每个编译器厂商实现的标准库都不一样,arm-gcc、ac编译器、TI-clang,私有实现会加强代码的兼容性。
而且部分实现的源码很难找,不知道他到底干了些什么,TI-clang 倒是会在编译器文件夹携带实现的源码,只不过以二进制链接。ac 我暂时找不到。

为什么不用 MicroLib 和 printf —— Arm 的 Semihosting - 土星环的基地
回复

使用道具 举报

6

主题

28

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2025-2-25 11:58:24 | 显示全部楼层
eric2013 发表于 2025-2-25 05:01
如果这样可以解决,且你说的错行发送了,这个是你上位机软件帧结束超时判断问题。

不知道根因是啥,我换了2个上位机软件都是一样的效果
回复

使用道具 举报

6

主题

28

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2025-2-25 12:00:21 | 显示全部楼层
yono 发表于 2025-2-25 09:50
如果是只是简单替换成私有 printf 就解决了的话,大概是 microLib 的 printf 实现有什么问题吧。
个 ...

我不是用keil写的,我是用clion+arm-gcc的编译环境
回复

使用道具 举报

24

主题

196

回帖

268

积分

高级会员

积分
268
QQ
发表于 2025-2-25 13:26:31 | 显示全部楼层
国产娃娃菜 发表于 2025-2-25 12:00
我不是用keil写的,我是用clion+arm-gcc的编译环境

arm-gcc确实,我以前也碰到过这个问题,不是串口,测试 JLINK-RTT 也打印不正常,链进去的标准库实现有问题。
回复

使用道具 举报

97

主题

537

回帖

843

积分

金牌会员

积分
843
发表于 2025-2-25 20:44:09 | 显示全部楼层
国产娃娃菜 发表于 2025-2-25 12:00
我不是用keil写的,我是用clion+arm-gcc的编译环境

gcc的话我同事遇到过printf打印不出来,不过他是完全不行。
我们以为printf是重定向有问题。

不过后来具体是啥原因,没跟踪。。因为我不用gcc。
共产主义一定胜利!
回复

使用道具 举报

6

主题

28

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2025-2-25 23:08:51 | 显示全部楼层
会飞的猪_2020 发表于 2025-2-25 20:44
gcc的话我同事遇到过printf打印不出来,不过他是完全不行。
我们以为printf是重定向有问题。

现在用上面哥推荐的printf库就没事了,而且占用flash还少,标准库的stdio.h占了20K左右
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 5 天前 | 显示全部楼层
yono 发表于 2025-2-25 09:50
如果是只是简单替换成私有 printf 就解决了的话,大概是 microLib 的 printf 实现有什么问题吧。
个 ...

可是sprintf,sscanf,strstr等函数真好用啊,难以割舍
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 23:04 , Processed in 0.348030 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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