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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版