关于 float 类型的2个问题和实验-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8277|回复: 2

关于 float 类型的2个问题和实验

[复制链接]
发表于 2016-11-21 21:46 | 显示全部楼层 |阅读模式
第一个问题:如何输出一个 float 的值。可以使用dtostrf 函数【参考1】。这个函数接受4个参数【参考2】。
char* dtostrf(double _val,signed char _width, unsigned charprec, char* _s)
_val:要转换的float或者double值。
_width:转换后整数部分长度。
_prec:转换后小数部分长度。
_s:转换以后的结果放在_s中。
第二个问题:如何传输一个 float 个人的建议是:按照byte 传输。这样避免了复杂的转换以及精度额损失。一个float 4个字节的大小,我们直接把它们读取出来即可。
编写一个代码来实验:
[mw_shl_code=c,true]float f1=1.234567;
float f2=1.234568;
byte *p;
byte  x1[]={0x4B,0x06,0x9E,0x3F};
byte  x2[]={0x53,0x06,0x9E,0x3F};
unsigned long x3=0x3F9E064B;
float *f;


void setup() {
  char s[20];
  Serial.begin(115200);
//我们将 f1 这个 float类型的数值转换为字符串类型,
//整数部分保留1位,小数部分保留6位
//可以从结果看到,可以正常输出1.234567
  dtostrf(f1,1,6,s);
  Serial.println(s);

//我们将 f1 这个 float类型的数值转换为字符串类型,
//整数部分保留1位,小数部分保留5位
//可以从结果看到,输出结果是 1.23456,最后的7被丢掉了
  dtostrf(f1,1,5,s);
  Serial.println(s);
//我们将 f1 这个 float类型的数值转换为字符串类型,
//整数部分保留1位,小数部分保留7位
//可以从结果看到,输出1.2345670 ,对于多出来的自动补零
  dtostrf(f1,1,7,s);
  Serial.println(s);

//我们将一个 float 拆开为4个bytes输出
  p=(byte *)&f1;
  Serial.print(*p,HEX);Serial.print(' ');
  Serial.print(*(p+1),HEX);Serial.print(' ');
  Serial.print(*(p+2),HEX);Serial.print(' ');
  Serial.print(*(p+3),HEX);Serial.println(' ');
  p=(byte *)&f2;
  Serial.print(*p,HEX);Serial.print(' ');
  Serial.print(*(p+1),HEX);Serial.print(' ');
  Serial.print(*(p+2),HEX);Serial.print(' ');
  Serial.print(*(p+3),HEX);Serial.println(' ');

//同样,我们可以将4个bytes合成一个 float
  f=(float * )&x1;
  dtostrf(*f,1,6,s);
  Serial.println(s);

  f=(float * )&x2;
  dtostrf(*f,1,6,s);
  Serial.println(s);

  f=(float * )&x3;
  dtostrf(*f,1,6,s);
  Serial.println(s);   
}

void loop() {
  // put your main code here, to run repeatedly:
  //Serial.println("ggg");
}
[/mw_shl_code]
运行结果:
ft.png
                              
因为 float这种类型的定义是有统一标准的,所以上面的方法还可以将 arduino 的数值通过串口传递给PC上的应用程序而不发生误差。
参考:
1.     http://blog.protoneer.co.nz/ardu ... ually-works/Arduino Float to String (That actually works)
2.     http://www.geek-workshop.com/thread-3383-1-1.html【LCD12864】发个很多朋友都能用的上的东西,int转char,用于12864显示数值~

发表于 2016-12-1 10:29 | 显示全部楼层
因为好多arduino使用者不会指针,所以我一般都说用结构体来分成一个个字节,这样大家好理解点~
发表于 2021-12-29 19:24 | 显示全部楼层
非常棒,学到了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:22 , Processed in 0.104935 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表