打印
[STM32F1]

在 STM32CubeIDE 中格式化浮点数

[复制链接]
345|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Hitomi22|  楼主 | 2025-4-15 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F103。在 STM32CubeIDE 中格式化浮点数时遇到问题。我在项目设置中勾选了 “use newlib-nano to print floating numbers” 来打印浮点数。
代码如下:
char strP[100];uint16_t cx = 0;cx = snprintf(strP, 100, "%6.2f, %6.2f, %6.2f, %6.2f", 0.0115697104, -0.0796313286, -0.0220388453, -0.111881733);
出现错误时,会打印:
26815634999686289245754584189029181710324847797922429453525901675501503951146118153956426275383940846635237101275691881352391832390627762028461487571337216.00,  0.00, -0.00,  0.00"
或:
0.00 2.00 0.00 2.00
已经测试过:
  • 通过 STM32CubeIDE 将堆栈从 0x400 增加到 0x500。
  • 更改链接器脚本。

使用特权

评论回复
沙发
公羊子丹| | 2025-5-28 07:27 | 只看该作者
我也碰到过这个问题,后来发现不仅要勾选浮点支持,还得在 syscalls.c 中手动开启 _write,否则输出会出问题。

使用特权

评论回复
板凳
周半梅| | 2025-5-28 07:28 | 只看该作者
你的 snprintf 用法看起来没问题,建议你检查一下 use float with printf 那个选项是否和 -u _printf_float 一起加进了链接器参数。

使用特权

评论回复
地板
帛灿灿| | 2025-5-28 07:29 | 只看该作者
改完堆栈之后有没有 clean 一下工程再重新 build?有时候老 build 文件会干扰结果。

使用特权

评论回复
5
童雨竹| | 2025-5-28 07:30 | 只看该作者
用的是哪个 libc?如果是 nano 版本,需要确保编译器链接参数里有 -u _printf_float 和 -u _scanf_float。

使用特权

评论回复
6
万图| | 2025-5-28 07:31 | 只看该作者
我之前是把 newlib-nano 换成 full newlib 就没问题了,虽然体积大了点,但浮点打印稳。

使用特权

评论回复
7
Wordsworth| | 2025-5-28 07:32 | 只看该作者
可以试试用 sprintf 替代 snprintf 看看有没有不同效果,我有个项目就是 snprintf 打印 float 有问题,sprintf 就正常。

使用特权

评论回复
8
Bblythe| | 2025-5-28 07:32 | 只看该作者
检查一下是否把 float 当成 double 传进去了,STM32F1 默认没有硬件浮点,容易出错。

使用特权

评论回复
9
Pulitzer| | 2025-5-28 07:33 | 只看该作者
用串口打印的时候,底层 _write() 实现正确吗?也可能是串口缓存没处理好导致数据打印异常。

使用特权

评论回复
10
Uriah| | 2025-5-28 07:34 | 只看该作者
有条件的话试试用 SEGGER RTT 代替 UART 来调试输出,我觉得它打印浮点数比串口稳定很多。

使用特权

评论回复
11
Clyde011| | 2025-5-28 07:35 | 只看该作者
这几个浮点数建议先在调试模式下 Watch 一下变量值,确认是 printf 打印错还是前面数据本身有误

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

21

帖子

0

粉丝