Arduino 如何将double转换为十六进制/字节

Arduino 如何将double转换为十六进制/字节,arduino,hex,byte,uint8t,arduino-c++,Arduino,Hex,Byte,Uint8t,Arduino C++,我需要向物联网发送数据,数据需要以字节为单位 要通过您需要使用的物联网来回发送数据 字节 有些函数返回一个带2位小数的浮点值 23.56 或 4.32 我很难转换我的浮点值并将其保存到可变的uint8\t数据中。我必须找到如何转换我的浮点变量 我有一个这样的循环: /* NOTE: uinit8_t mydata[64]; byte nbMaxCapteurs = 10; mesMesures[i][mesCapteur[i].idDuCapteur].valeur => this is

我需要向物联网发送数据,数据需要以字节为单位

要通过您需要使用的物联网来回发送数据 字节

有些函数返回一个带2位小数的浮点值

23.56 或 4.32

我很难转换我的浮点值并将其保存到可变的uint8\t数据中。我必须找到如何转换我的浮点变量

我有一个这样的循环:

/*
NOTE:
uinit8_t mydata[64];
byte nbMaxCapteurs = 10;
mesMesures[i][mesCapteur[i].idDuCapteur].valeur => this is a float
*/

memset(mydata, 0xFF, 64);
uint8_t * ptr = mydata;
for (byte i = 0; i < nbMaxCapteurs; i++) {
  if (mesCapteur[i].actif) {
    *ptr = mesMesures[i][mesCapteur[i].idDuCapteur].valeur;
    ptr += 15; // How to know the number of step to move the pointer
    if (i < nbCapteurActif + 1) {
      *ptr = 0x2C; // virgule
      ptr += sizeof(char);
    }
  } else {
    *ptr = 0x2C; // virgule pour les capteurs inactifs
    ptr += sizeof(char);
  }
}
*ptr = '00'; // Close \0
ptr += sizeof(char);
printData();
printData打印以下内容:

04 FF FF FF FF FF FF FF FF FF FF FF FF FF 2C 18 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 2C CB FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 2C A8 FF FF FF FF FF FF FF FF FF FF 2C

但它至少应该打印以下内容:

34 2E 33 32 FF FF FF FF FF FF FF FF 2C 18 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 2C CB FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 2C A8 FF FF FF FF FF FF FF FF FF FF 2C

因为
342e3332
等于4.32

我不明白,也不知道如何“合并”和转换浮点值。然后你能帮我把指针按照浮点数的大小移动吗

我真的被这个话题难住了,我非常感谢你的帮助。

  • 如果要在小数点后两位向零舍入,可以使用以下方法:

    double lum = ((int)(luminosity * 100))/100.0;
    
    #include <math.h>
    double lum = round(luminosity * 100)/100.0;
    
  • 如果要将小数点后两位四舍五入到最近的位置(从零开始四舍五入),可以使用以下命令:

    double lum = ((int)(luminosity * 100))/100.0;
    
    #include <math.h>
    double lum = round(luminosity * 100)/100.0;
    
    正如您所看到的,仅使用8位是非常有限的,并且您没有像前面的方法那样灵活地选择范围。定点数字的优点是,您可以对它们成对执行算术函数(加法、减法、乘法和除法)

    • (我对Arduino一无所知)

      使您接近目标的最小变化是:

      double luminosity;
      uint32_t lum;
      lum = (uint32_t)(luminosity * 100);
      
      现在,lum将包含你的值乘以100,四舍五入

      你得到的不是23.45分,而是2345分。使用uint8\u t会限制您太多,因为范围太小(0-255)。您是否有uint16和uint32可用,我不知道


      这种技术被称为定点算术。

      你认为一个
      uint8\u t
      可以代表多少不同的值?十进制分隔符前后的两个十进制数字各有多少个值?uint8\u t只有8位,因此只有256个可能的值。一个双精度的1位数+2位小数有1000个可能的值,所以这是不可能的。你只是问如何将一个数字四舍五入到小数点后2位?或者你真的想把它放在一个
      uint8\u t
      ((int)(光度*100))/100.0
      应该为你做“uint8不保留小数的估计”。嗯,这是一个开始。根据定义,它没有小数。C11标准草案n1570:6.3转换6.3.1.4实浮点和整数1当实浮点类型的有限值转换为除_Bool以外的整数类型时,小数部分被丢弃(即,该值被截断为零)。注意这里的“截断”而不是“四舍五入”;结果应该仍然有小数位。arduino使用8位micro和32位arthmetics对它来说有点太贵了。我认为uint16_t就足够了(32位整数的乘法和除法几乎和浮点运算一样昂贵)