第一个问题:如何输出一个 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] 运行结果: 因为 float这种类型的定义是有统一标准的,所以上面的方法还可以将 arduino 的数值通过串口传递给PC上的应用程序而不发生误差。 参考:
|