嗯,这个怎么样:
void send_float (float arg)
{
// get access to the float as a byte-array:
byte * data = (byte *) &arg;
// write the data to the serial
Serial.write (data, sizeof (arg));
}
是的,要发送这些数字,您必须首先将它们转换为ASCII字符串。如果您正在使用C语言,sprintf()
是我认为最方便的方法来进行此转换:
[稍后添加:啊啊啊!我忘记了对于ints
/longs
,函数的输入参数应该是无符号的。同样适用于传递给sprintf()
的格式字符串。因此,我在下面进行了更改。抱歉我的糟糕疏忽,这可能会成为一个难以发现的错误。此外,ulong
使其更加通用。]
char *
int2str( unsigned long num ) {
static char retnum[21]; // Enough for 20 digits plus NUL from a 64-bit uint.
sprintf( retnum, "%ul", num );
return retnum;
}
char *float2str( float float_num)
和 char *dbl2str( double dblnum)
。大小是否重要?如果是的话,您可以使用ASCII85将每个32位组编码为5个ASCII字符,详情请参见http://en.wikipedia.org/wiki/Ascii85。
也许这是将浮点数转换为字节和将字节转换为浮点数的最佳方法,-Hamid Reza。
int breakDown(int index, unsigned char outbox[], float member)
{
unsigned long d = *(unsigned long *)&member;
outbox[index] = d & 0x00FF;
index++;
outbox[index] = (d & 0xFF00) >> 8;
index++;
outbox[index] = (d & 0xFF0000) >> 16;
index++;
outbox[index] = (d & 0xFF000000) >> 24;
index++;
return index;
}
float buildUp(int index, unsigned char outbox[])
{
unsigned long d;
d = (outbox[index+3] << 24) | (outbox[index+2] << 16)
| (outbox[index+1] << 8) | (outbox[index]);
float member = *(float *)&d;
return member;
}
致敬。
对于Arduino IDE:
float buildUp(int index, unsigned char outbox[])
{
unsigned long d;
d = (long(outbox[index +3]) << 24) | \
(long(outbox[index +2]) << 16) | \
(long(outbox[index +1]) << 8) | \
(long(outbox[index]));
float member = *(float *)&d;
return member;
}
否则不起作用。