首页 > 解决方案 > 如何将浮点值添加到 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();
  }
  
}

标签: arrayscarduino

解决方案


浮点数的大小为 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];

推荐阅读