第一个问题:如何输出一个 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"); }
因为 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显示数值~