你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeIDE使用sprintf/printf发送浮点数失败

[复制链接]
wudecao-326254 提问时间:2019-5-30 12:17 /
本帖最后由 wudecao-326254 于 2019-5-30 12:20 编辑

求助:
sprintf(str,"v=%6.3f\n\r",0.3333);

printf("v=%6.3f\n\r",0.3333); 使用串口1发送
均得到的是v=0.000,
已按照truestudio的一些教程设置了-u_printf_float标志

这个函数的浮点功能,很重要呀,一些程序调试,打印Debug信息,液晶显示等都会用到
实在不行就只有换回Keil+stm32cubeMX了

求大神指点指点!!!
QQ图片20190530121531.png QQ图片20190530121552.png QQ图片20190530121611.png







收藏 评论10 发布时间:2019-5-30 12:17

举报

10个回答
edmundlee 回答时间:2019-5-30 12:24:16
没用过这函数, 不过从字面理解, 它是把用 _print_float 代替printf的意思
要不你试试
_print_float("v=%6.3f\n\r",0.3333);

点评

应该不是您说的这个问题,但谢谢回复!  发表于 2019-5-30 13:37

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

wenyangzeng 回答时间:2019-5-30 12:36:53
printf("V=%6.3f\n\r",0.333);
貌似应该写成:
printf("V=%6f\n\r",0.333);才是

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

wudecao-326254 回答时间:2019-5-30 12:48:11
本帖最后由 wudecao-326254 于 2019-5-30 12:53 编辑
wenyangzeng 发表于 2019-5-30 12:36
printf("V=%6.3f\n\r",0.333);
貌似应该写成:
printf("V=%6f\n\r",0.333);才是

应该不是printf函数的问题,是stm32cubeIDE系统设置的问题
写6.3是保留3位小数的意思直接写printf("v=%f\n\r",0.333);
输出的是v=0.000000




目前我只能这样写了,用%d来替代%f:
char str[100];
float volt=1.23456;
sprintf(str, "volt=%d.%03d\n\r", (int) volt, (int) ((volt - (int) volt) * 1000));


str获得赋值"volt=1.234",但这样写好折腾
wenyangzeng 回答时间:2019-5-30 15:09:05
wudecao-326254 发表于 2019-5-30 12:48
应该不是printf函数的问题,是stm32cubeIDE系统设置的问题
写6.3是保留3位小数的意思直接写printf("v=%f\n ...

好像要添加头文件:#include <stdio.h>
wudecao-326254 回答时间:2019-5-31 09:16:57
wenyangzeng 发表于 2019-5-30 15:09
好像要添加头文件:#include

谢谢回复,不是这个问题,没有加stdio.h编译通不过的。
是GCC编译器精简了printf/sprintf的float输出功能,本来应该在LINK时添加-u_printf_float标志,来启用float功能。

但是没有添加-u_printf_float完全没有数字输出,添加-u_printf_float数字输出为0.0000,都不对。恐怕是是stm32cubeIDE有Bug
g921002 回答时间:2019-6-1 00:56:25
本帖最后由 g921002 于 2019-6-1 00:59 编辑

重定向好麻煩
我是用巨集定義,沒有平台問題
int8_t u3txbuf[1000];
#define print3UART(...) sprintf(u3txbuf, __VA_ARGS__);HAL_UART_Transmit(&huart3,u3txbuf,strlen(u3txbuf),1000)

然後在project settings: C/C++ Build -> Settings -> Tool Settings -> MCU GCC Linker -> Miscellaneous -> Linker flags 中加入-u _scanf_float 就可以打印浮點

ex:
print3UART("[%d]TEST!!=%f\r\n",123,0.25f);
這個在SW4STM32中使用,同樣都是 Eclipse 基礎的IDE,設定都應該差不多。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

吹梦到西洲。 回答时间:2019-6-17 15:38:39
wudecao-326254 发表于 2019-5-30 12:48
应该不是printf函数的问题,是stm32cubeIDE系统设置的问题
写6.3是保留3位小数的意思直接写printf("v=%f\n ...

问题解决了吗
pl446332161 回答时间:2019-7-26 17:22:06
专门注册论坛回复的,有一个方法可以解决,修改inc文件夹下的FLASH.ld文件,比如我现在用的F407VET6,那就是修改STM32F407VETX_FLASH.ld,打开这个文件,定位到这行,_estack = 0x2001ffff;        /* end of "RAM" Ram type memory */,把这个值加1,改为_estack = 0x20020000;然后就可以打印浮点数了
wudecao-326254 回答时间:2020-2-9 18:15:12
pl446332161 发表于 2019-7-26 17:22
专门注册论坛回复的,有一个方法可以解决,修改inc文件夹下的FLASH.ld文件,比如我现在用的F407VET6,那就 ...

谢谢,是这个问题,已经解决!!

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版