arrays - 如何将浮点值添加到 C/Arduino 中的字节数组?
问题描述
我有以下代码:
float a = 12.38;
float b = 24.38;
float c = 25.78;
float d = 20.00;
byte dataArray[4] = {a, b, c, d};
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(dataArray[0]);
}
我想得到的输出是12.38
,但我得到的是12
. 浮点数转换为整数。我使用字节数组的原因是因为我想使用字节数组作为使用 I2C 通信发送给 Master 的消息:
Wire.beginTransmission(slaveAddress); //address is queued for checking if the slave is present
for (int i=0; i<4; i++)
{
Wire.write(dataArray[i]); //data bytes are queued in local buffer
}
Wire.endTransmission();
然后,Master 将使用以下代码读取并转换回原始数组:
#include<Wire.h>
#define slaveAddress 8
byte dataArray[4];
void setup()
{
Wire.begin(slaveAddress);
Serial.begin(9600);
//-----------------------------------
Wire.onReceive(receiveEvent);
}
void loop()
{
Wire.onReceive(receiveEvent);
Serial.println(dataArray[1]);
}
void receiveEvent(int howmany)
{
for(int i=0; i<howmany; i++)
{
dataArray[i] = Wire.read();
}
}
解决方案
浮点数的大小为 4 个字节。因此,您需要在数组中使用 4 个字节来存储每个浮点数。如果要传递 4 个浮点数,则需要 16 个字节
您可以将指针强制转换float
为字节数组:
float a = 12.34
byte dataArray[4] = {
((uint8_t*)&a)[0],
((uint8_t*)&a)[1],
((uint8_t*)&a)[2],
((uint8_t*)&a)[3]
};
并在接收端进行相反的操作:
float a;
((uint8_t*)&a)[0] = dataArray[0];
((uint8_t*)&a)[1] = dataArray[1];
((uint8_t*)&a)[2] = dataArray[2];
((uint8_t*)&a)[3] = dataArray[3];
推荐阅读
- android - Android ConstraintLayout 垂直权重显示不正确
- google-cloud-platform - 我可以重新启动 Cloud Composer 环境吗?
- php - 如何在 Laravel 中同时基于同一个数据集渲染两个不同的视图?
- javascript - react-grid-layout 中网格项的初始定位是随机生成的
- eclipse - 尝试修复缺少的工具栏后 Eclipse Neon 无法启动
- android - 在 Runnable 中调用意图会使 android studio 中的应用程序崩溃
- regex - HTML 页面中的模式匹配
- r - 重新排序 expss 表的列
- laravel-5.6 - 如何使用 SQLite 数据库在 phpdesktop 应用程序中运行 laravel5.6 应用程序
- typescript - 'Function' 类型的参数不能分配给 '(...args: any[]) => void' 类型的参数