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

STM32 无法打印%f

[复制链接]
cyang 提问时间:2018-2-27 13:23 /
在stm32中执行如下代码
float a = 0.1;
printf("%f\n",a);

输出为 %f ,就是“%f”这两个字符
如果是%d就正常
怎么解决?

收藏 评论18 发布时间:2018-2-27 13:23

举报

18个回答
cyang 回答时间:2018-2-28 09:43:05
感谢大家的回复。问题解决了。在IAR设置里,有对 printf 的设置,默认是不支持浮点数的。修改选项后便可。如下:
Image 1.png

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结贴奖励,解决就好~

查看全部评分

xmstudio 回答时间:2018-2-28 10:49:30
拆开就可以了啊,没必要这么麻烦,把一个float拆成两个int类型的整数部分和小数部分,其中ADC_Final_Result是float型,ADC_Final_Result_d和ADC_Final_Result_f是uint16_t
  1.     ADC_Final_Result = ADC_Result_Sum * 3.358 / 4095 / 8;        //基准3.358V

  2.                   /* 因为sprintf不能输出float型变量,拆成两个int输出 */
  3.                   ADC_Final_Result_d = (uint16_t)ADC_Final_Result;        //整数部分
  4.                   ADC_Final_Result -= ADC_Final_Result_d;        //减去整数
  5.                   ADC_Final_Result_f = (uint16_t)(ADC_Final_Result * 1e03);        //保留三位小数
  6.                   sprintf(cBuffer, "Voltage = %d.%03dV", ADC_Final_Result_d, ADC_Final_Result_f);
  7.                   OLED_Print(cBuffer, 4);
复制代码


nyszx 回答时间:2018-2-27 21:14:19
应该是IAR编译器问题,参见IAR官方说明:

  1. Technical Note 85413
  2. Targets:
  3. ARM
  4. Component:
  5. General
  6. Updated:
  7. 2015/9/11 14:25
  8. Introduction

  9. In some cases, printf of floating point (%f) does not seem to work.
  10. Solution

  11. The IAR C/C++ Compiler for ARM requires the Stack Pointer to be aligned at 8 bytes. 8-byte alignment is required by AEABI (and some instructions generated by the compiler for some cores).

  12. The default cstartup code automatically initializes the ARM core stack(s) to an 8-byte aligned address. Make sure that your application and/or RTOS also does this.
  13. Background

  14. According to the MQX release notes, stack alignment is not ensured in MQX 3.7. The behavior is corrected in MQX 3.8. This problem has also been observed with other RTOSes.


  15. All product names are trademarks or registered trademarks of their respective owners.
复制代码

评分

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

查看全部评分

Angel_YY_ST 回答时间:2018-2-27 14:40:31
提示: 作者被禁止或删除 内容自动屏蔽
wudianjun2001 回答时间:2018-2-27 15:23:39
进入函数里面看看,是不是做特殊处理了

评分

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

查看全部评分

cyang 回答时间:2018-2-27 15:55:28
Angel_YY 发表于 2018-2-27 14:40
用的什么编译器?开发环境要说清楚些才好解决。
可以试试"%lf"

用的是 IAR。
试了用%lf,效果一样
cyang 回答时间:2018-2-27 15:56:35
wudianjun2001 发表于 2018-2-27 15:23
进入函数里面看看,是不是做特殊处理了

printf函数就是重定向到串口输出而已,打印定点数,十六进制,字符,字符串都没问题。
wenyangzeng 回答时间:2018-2-27 16:25:50
printf("%4f",a);试看看,
还有检查一下引号是否键入全角了。

评分

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

查看全部评分

cyang 回答时间:2018-2-27 18:03:05
wenyangzeng 发表于 2018-2-27 16:25
printf("%4f",a);试看看,
还有检查一下引号是否键入全角了。

printf("a = %4f\n",a);
的结果是 a =   %f, 等号和百分号之间有三个空格。

如果符号是全角的,是不能编译通过的。
maxtch 回答时间:2018-2-27 18:34:31
看来 IAR 的 printf 把打印浮点给精简掉了。这块代码的确是很占地方,我平时用 GCC + newlib 一般也是用去掉这个功能的 newlib-nano。你看看有没有那个编译或连接选项可以解决这个问题的,或者是换成 GCC + 完整 newlib 的组合。

评分

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

查看全部评分

pythonworld 回答时间:2018-2-27 18:37:47
打印浮点数比较耗费内存,有些编译器需要加option,具体看看编译器的帮助。

评分

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

查看全部评分

nyszx 回答时间:2018-2-27 21:14:53
七哥 回答时间:2018-2-27 22:01:18
对IAR不熟,会一点。
用LCD习惯了,一般先sprintf到字符串,然后再printf打印字符串。

评分

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

查看全部评分

cyang 回答时间:2018-2-28 09:45:19
toofree 发表于 2018-2-27 22:01
对IAR不熟,会一点。
用LCD习惯了,一般先sprintf到字符串,然后再printf打印字符串。 ...

先使用如下代码 sprintf 再打印字符串也是不可以的。输出结果为 %f * * * *

void printf_float(float a)
{
        char tmp[8]={0};
        int i;
        sprintf(tmp, "%f", a);
        for(i=0; i<8; i++)
                printf("%c", tmp);
        printf("\n");
}

问题解决了,见#13
cyang 回答时间:2018-2-28 09:46:22
nyszx 发表于 2018-2-27 21:14
附上官方地址吧:http://www.iar.com/support/tech-notes/general/problems-with-printf-floating-point-f- ...

感谢,不过应该不是这个问题吧。我没用任何OS。

问题解决了,见#13
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版