关于 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;
bytex1[]={0x4B,0x06,0x9E,0x3F};
bytex2[]={0x53,0x06,0x9E,0x3F};
unsigned long x3=0x3F9E064B;
float *f;
void setup() {
char s;
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");
}
运行结果: 因为 float这种类型的定义是有统一标准的,所以上面的方法还可以将 arduino 的数值通过串口传递给PC上的应用程序而不发生误差。 参考:1. http://blog.protoneer.co.nz/arduino-float-to-string-that-actually-works/Arduino Float to String (That actually works)2. http://www.geek-workshop.com/thread-3383-1-1.html【LCD12864】发个很多朋友都能用的上的东西,int转char,用于12864显示数值~
因为好多arduino使用者不会指针,所以我一般都说用结构体来分成一个个字节,这样大家好理解点~ 非常棒,学到了
页:
[1]