[STM32F1] 在 STM32CubeIDE 中格式化浮点数

[复制链接]
773|12
 楼主| 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 文件会干扰结果。
童雨竹 发表于 2025-5-28 07:30 | 显示全部楼层
用的是哪个 libc?如果是 nano 版本,需要确保编译器链接参数里有 -u _printf_float 和 -u _scanf_float。
万图 发表于 2025-5-28 07:31 | 显示全部楼层
我之前是把 newlib-nano 换成 full newlib 就没问题了,虽然体积大了点,但浮点打印稳。
Wordsworth 发表于 2025-5-28 07:32 | 显示全部楼层
可以试试用 sprintf 替代 snprintf 看看有没有不同效果,我有个项目就是 snprintf 打印 float 有问题,sprintf 就正常。
Bblythe 发表于 2025-5-28 07:32 | 显示全部楼层
检查一下是否把 float 当成 double 传进去了,STM32F1 默认没有硬件浮点,容易出错。
Pulitzer 发表于 2025-5-28 07:33 | 显示全部楼层
用串口打印的时候,底层 _write() 实现正确吗?也可能是串口缓存没处理好导致数据打印异常。
Uriah 发表于 2025-5-28 07:34 | 显示全部楼层
有条件的话试试用 SEGGER RTT 代替 UART 来调试输出,我觉得它打印浮点数比串口稳定很多。
Clyde011 发表于 2025-5-28 07:35 | 显示全部楼层
这几个浮点数建议先在调试模式下 Watch 一下变量值,确认是 printf 打印错还是前面数据本身有误
t60yz 发表于 2025-5-31 23:39 | 显示全部楼层
默认 是不支持浮点数格式化打印 的,启用浮点支持需要额外的链接选项和正确的库配置。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

59

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部