如何在 C/Arduino 中将浮点值添加到字节数组?

Naw*_*ain 1 c arrays 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]);

}
Run Code Online (Sandbox Code Playgroud)

我想要得到的输出是,12.38但我得到的是12. 浮点数被转换为整数。我使用字节数组的原因是因为我想使用字节数组作为使用 I2C 通信发送给主设备的消息:

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();
Run Code Online (Sandbox Code Playgroud)

然后,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();
  }
  
}
Run Code Online (Sandbox Code Playgroud)

Ate*_*Lux 6

浮点型的大小为 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]
   };
Run Code Online (Sandbox Code Playgroud)

并在接收端进行相反的操作:

    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];
Run Code Online (Sandbox Code Playgroud)