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

第一个问题:如何输出一个 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个字节的大小,我们直接把它们读取出来即可。
编写一个代码来实验:

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");
}

 

运行结果:
214631m6m64qplpxg6fbit

因为 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显示数值~

发表评论

电子邮件地址不会被公开。 必填项已用*标注