ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Arduino uno mega2560

2021-03-03 20:03:06  阅读:287  来源: 互联网

标签:KB Arduino float char sprintf printf uno mega2560


为何 Arduino 的 printf/sprintf 不支援 float / double / long long 

参考1:https://www.cnblogs.com/smartlife/articles/12416417.html

参考2:https://blog.csdn.net/electrocrazy/article/details/52817193

大部分坛友是用 UNO 吧?
UNO 的程序码空间只有 32KB, RAM 只有 2KB 
那你就该已经猜到为何大部分的 MCU 不支持完整的 printf/sprintf 啦 !
   (1)首先强调一下, 用 UNO, 则 Arduino 的 double 根本是骗人的,
      因为 Arduino 的 CPU 是 8 bit CPU, 意思是大部分指令都只处理 8 bit,
      float 用 32 bit 已经很辛苦, double 用 64 bit岂不更辛苦 !?
      参考用百度查询 "IEEE 754" 看看就知道了!
   (2)在标准 C 的程序库大约有一百多个函数(不算入 C++ 的喔),
      其中很多函数都是一行两行就做完了,
      但是, 标准 C 的 printf( ) 却多达两千多行(包括相关的sprintf/vsprintf等) !
      想一想, 如果 Arduino 也让你真的可以像在 PC 或大型计算机上
      使用 printf( )/sprintf( ) 的所有功能,
      那你的 32KB 程序码空间(Flash)可能就去掉六分之一啰!
   (3)其实就算是现在精简版的 printf/sprintf 也占用约1.5KB,
      只要你的程序码用了一行 sprintf( ) 或 printf( ),
      你编译出的机器码就会多大约 1.5KB, 注意还是不支持 %f 喔 !
      当然多用几行并不会再增加太多(只是多了参数传递与函数调用)!
   (4)如果你希望做出类似 float 的 “%6.3f” 格式效果,
     你可以这样:
         char tmps[15];  float ans = 58.35678;
         sprintf(ans, 6, 3, tmps);  
Serial.print(“ans=”);  Serial.println(tmps);
注意这用到的 dtostrf( ) 本身也占用大约 1.6KB;
      所以你可以故意用一行 dtostrf( ) 再重新编译看看它占多少空间 !?
   (5)啥? 你说反正 Flash/ROM 程序码空间有 31.5KB 不怕喔 !?
      (以 Arduino IDE 1.0.6 为例, 有 32256 Bytes = 32768 - 512 Byte BootLoader)
      如果简单程序码当然没问题啦 !
      要注意, 使用C++的 String 字符串也是要多用大约 1.5KB的空间!
         当你随着传感器或GSM/Wifi/Ethernet 一直加上去,
      你会发现很快的, 31.5KB 好像不太够用了!
      这时你就要想办法尽量节省着用啰,
      能不用的当然就不用 !
      例如, 用了 String 了(这好像比较好用吧),
      那就尽量不要再用 dtostrf( ) 以及 sprintf( );
         如果空间真的不够用, 且你须要更快的执行效能,
      则可能也不要用 String 类别, 因为 String 类别不但多用了 1.5KB,
      而且它比传统 C 的字符串(就是 char array[ ])处理慢数倍! (这我以前有写过 !)
      只是传统 C 的 strcat( ), strcpy( ), strncpy( ) 使用要很小心,
      且对大多数 Arduino 的入门者也不好用 :-(
      所以空间足够时当然先用 C++ 的 String 来处理方便多了 !

 

如果尝试使用sprintf()函数在arduino上进行对float指转换为一个字符串的话,你会发现,it doesn't work。弄了很久,还以为是没学c++的原因。其实在arduino上,这个函数就是不对float起作用。

替代的方法是使用dtostrf()函数。

 

har* dtostrf(double _val,signed char _width, unsigned char prec, char* _s)


_val:要转换的float或者double值。

 

_width:转换后整数部分长度。(最小长度)

_prec:转换后小数部分长度。

_s:保存到该char数组中。

 

标签:KB,Arduino,float,char,sprintf,printf,uno,mega2560
来源: https://www.cnblogs.com/dengziqi/p/14476572.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有