打印
[Kinetis]

关于printf()函数无法打印浮点数的问题

[复制链接]
4524|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 韬铸88 于 2015-8-1 14:32 编辑

最近在学习Kinetis芯片,发现在使用codeWarrior、PE工具写代码调试时,发现使用printf()函数无法打印浮点数。情况如下:
double Dataout = 2.55;
printf("Dataout = %1.3f.\r\n",Dataout);

执行以上代码,输出的结果是:
Dataout = %1.3f.

如果是强制转换Dataout的数据类型为int,情况是:
double Dataout = 2.55;
int datout = 0;
datout = (int)(Dataout * 100);
printf("Dataout = %d.\r\n",datout);

打印输出是:
Dataout = 255.

不知道怎么回事,为什么printf()函数打印不出浮点数呢?请各位给予指点指点,谢谢!
###############################################################################################################
经昨天楼下的建议,改用转换为字符串再打印输出的方法。刚实验了一下,还是不行。转换不了字符串。情况如下:
double Dataout = 2.55;
unsigned char datout[50] = {0};

sprintf(datout, "Dataout = %1.3f.", Dataout);
printf("%s.\r\n",datout);

执行程序,打印结果输出为:
Dataout = %1.3f.

太奇怪了,什么情况导致不能实现呢?库函数有问题吗?查找printf()、sprintf()函数,发现是在\Freescale\CW MCU v10.6\MCU\ARM_GCC_Support\ewl\EWL_C\include\cstdio文件中声明,未找到实现函数代码。
##################################################################################################################
另外,我用kds新建一个工程,同样的做浮点数打印输出,打印结果与使用CW建的工程打印结果是一样的现象。


################################################################################################################
今天把之前在CW、KDS下建的工程代码,转到IAR上去编译调试的时候,发现原来的代码可以打印出浮点数。特此在这里追加这一结果,谢谢大家!






相关帖子

沙发
侣行天下| | 2015-7-28 20:27 | 只看该作者
把浮点数转换成字符串再打印出来吧

使用特权

评论回复
板凳
追逐浪花| | 2015-7-28 20:40 | 只看该作者
一般处理浮点数开销比较大,转换成字符串好些吧

使用特权

评论回复
地板
韬铸88|  楼主 | 2015-7-28 21:05 | 只看该作者
侣行天下 发表于 2015-7-28 20:27
把浮点数转换成字符串再打印出来吧

嗯,也行,多谢啦。

使用特权

评论回复
5
韬铸88|  楼主 | 2015-7-28 21:07 | 只看该作者
追逐浪花 发表于 2015-7-28 20:40
一般处理浮点数开销比较大,转换成字符串好些吧

好的,多谢,sprintf()转换字符串,再打印输出,但为什么不能直接打印输出呢?不解?

使用特权

评论回复
6
ccw1986| | 2015-7-29 09:18 | 只看该作者
你是打印到串口吗?

使用特权

评论回复
7
韬铸88|  楼主 | 2015-7-29 09:38 | 只看该作者
ccw1986 发表于 2015-7-29 09:18
你是打印到串口吗?

是的,打印到串口,使用的是CsIO1:ConsoleIO这个Component。配置的是UART0。

使用特权

评论回复
8
elecintop| | 2015-7-29 09:56 | 只看该作者
看看官方的例程。你的重定向没做好吧,或者是格式的问题。

使用特权

评论回复
9
hdp7891000| | 2015-7-29 12:27 | 只看该作者
你看下函数的说明,printf的实现不全是一样的,有可能这个格式不认

使用特权

评论回复
10
韬铸88|  楼主 | 2015-7-29 14:12 | 只看该作者
elecintop 发表于 2015-7-29 09:56
看看官方的例程。你的重定向没做好吧,或者是格式的问题。

请问重定向时,需要注意些什么呢?格式问题又会出现在哪里不对?望给个例程,谢谢!

使用特权

评论回复
11
奥德赛| | 2015-7-29 14:14 | 只看该作者
楼主把你的相关的代码贴出来看看吧,看看是不是格式的问题

使用特权

评论回复
12
韬铸88|  楼主 | 2015-7-29 14:17 | 只看该作者
hdp7891000 发表于 2015-7-29 12:27
你看下函数的说明,printf的实现不全是一样的,有可能这个格式不认

printf()的函数代码,无法看到

使用特权

评论回复
13
xmar| | 2015-7-29 14:36 | 只看该作者
这有什么奇怪。编译器不支持printf()打印浮点数,或编译环境设置不对。

使用特权

评论回复
14
李冬发| | 2015-7-29 15:10 | 只看该作者
要是printf()不支持%f参数,那sprintf()一样是不支持的。想其它办法吧。

使用特权

评论回复
15
monkeypony| | 2015-7-29 15:36 | 只看该作者
xmar 发表于 2015-7-29 14:36
这有什么奇怪。编译器不支持printf()打印浮点数,或编译环境设置不对。

我以为所有的编译器都支持呢

使用特权

评论回复
评论
xmar 2015-7-29 15:52 回复TA
单片机ROM、RAM存储容量通常较小。为了减少对ROM、RAM的过多消耗,printf()功能一般受到限制。也有编译器Option可以选择设置printf()的功能。 
16
Messi1999| | 2015-7-29 17:15 | 只看该作者
楼主用的这款芯片也不支持printf吗

使用特权

评论回复
17
韬铸88|  楼主 | 2015-7-29 22:01 | 只看该作者
Messi1999 发表于 2015-7-29 17:15
楼主用的这款芯片也不支持printf吗

我用的是mk22fx512vlh12,发现使用printf打印浮点数不行。查看了论坛上有个贴是“【经验分享】Kinetis IAR工程下无法打印浮点的问题解决”上面有介绍。但是这帖子是关于IAR工程的,而CW、KDS工程的没有相关介绍,虽想从这个帖子中,得到借鉴、可以解决,但是水平有限,解决不了。

使用特权

评论回复
18
dragon_hn| | 2015-7-30 11:31 | 只看该作者
在IAR中有下面选项。楼主对照你的编译器看看是否有类似选项?


使用特权

评论回复
19
韬铸88|  楼主 | 2015-7-30 13:14 | 只看该作者
dragon_hn 发表于 2015-7-30 11:31
在IAR中有下面选项。楼主对照你的编译器看看是否有类似选项?

没有找到该选项

使用特权

评论回复
20
木子不二| | 2016-7-1 12:01 | 只看该作者
dragon_hn 发表于 2015-7-30 11:31
在IAR中有下面选项。楼主对照你的编译器看看是否有类似选项?

你这个选择选FULL 就好了哈哈

使用特权

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

本版积分规则

12

主题

126

帖子

1

粉丝