【问题标题】:Arduino String to floatArduino字符串浮动
【发布时间】:2017-06-15 11:31:48
【问题描述】:

我正在尝试将 HEX 字符串转换为单个浮点值。该字符串长 4 个字节。它被定义为:

String B = "";

它是一个较长字符串的子字符串:

B = input.substring(6,14);

这会导致我尝试将字符串转换为单个浮点值。
网上我找到了如下代码:

float y = *(float*)&B;

这编译没有错误,但是当我运行代码时它总是0.000000。我猜我不能将该函数与字符串一起使用。一个典型的字符串可以是"bb319ba6",它应该是-0.002710083。为此,我使用的是我在网上找到的 IEEE 754 转换器。

我基本上需要在 Arduino 上进行相同的转换。我希望有人可以帮助我。

【问题讨论】:

  • 问题:为什么不首先输入浮点值?
  • 我看到你已经包含了 IEEE-754 标签。该规范在其对 matissa 布局、指数和使用的偏差的定义中是明确的。您需要进行一些冗长的按位操作,但可以做到。遵循规范。
  • 有一个带有 ADC 的放大器,用于连接到 Arduino 的力传感器。我得到的输入数据是单个字节,然后我将其放入一个字符串中。
  • float y = *(float*)&B; 这行没有意义。您将String* 重新解释为float*。如果您有 4 个字节 b1,b2,b2,b3,(lsB 到 msB),那么您可以通过执行 b1 | (b2 << 8) | (b3 << 16) | (b4 << 24) 将它们卷积为 32 位整数,然后将其重新解释为浮点数。 (stackoverflow.com/questions/3991478/…, stackoverflow.com/questions/26310249/…)

标签: string arduino floating-point ieee-754


【解决方案1】:

您真的不应该在这些 RAM 有限的 Arduino 上使用 String。它可能会导致奇怪的错误并在随机时间后挂起(更多信息here)。只需使用字符数组来保存从传感器接收到的字符。下面是一些适用于Stringchar[] 的代码:

uint8_t fromHex( char c )
{
  if ((0 <= c) && (c <= '9'))
    return (c - '0');
  if ('A' <= c) && (c <= 'F'))
    return (c - 'A');
  if ('a' <= c) && (c <= 'f'))
    return (c - 'a');
  return 0; // not a hex digit
}

void foo()
{
  float    y;
  uint8_t *yPtr = (uint8_t *) &y; // a pointer the the 4 bytes of `y`

  for (uint8_t i=0; i<sizeof(y); i++) {
    *yptr   = fromHex( B[ 6+2*i ] ) << 4;
    *yptr++ = fromHex( B[ 6+2*i + 1] );
  }
    ...

它只是将 4 个字节存储到 float,因为 Arduino floats 已经使用 IEEE 754 格式。无需对指数、尾数等进行解码。

【讨论】:

    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多