atof()将3位数字返回2位数

时间:2014-08-17 22:30:09

标签: floating-point arduino atof

我正在尝试使用串行通信解析发送到我的arduino uno的字符串到浮点数。我想使用这些浮点数来设置RGB LED的颜色。我的问题是,它只会读取前2位数字。八九不离十。假设我输入了100.它只会出现在10.00。如果它是231,它将出现在23.00。奇怪的是,如果我把32.43,它将会出来32.4300。我不知道为什么会这样做。这是我的代码:

float led1Color[3];

...

for (int i = 0; i < 3; i++) {
    int index = content.indexOf(",");
    content = content.substring(index + 1); //removes additional text in front of numbers
    led1Color[i] = atof(content.substring(0, index).c_str());
    Serial.println(led1Color[i], 4);
}

现在我可以说发送了以下内容:“RGBLED,43.61,52,231”。首先,删除RGBLED。然后,控制台显示的3个值如下:

  

43.6100   52.0000   23.0000

显然这里的问题是我需要值231,而不是23.0000。我以前从来没有用C / C ++编程,所以有什么我想念的吗?为什么将三位数转换为两位数?

1 个答案:

答案 0 :(得分:1)

您的错误是索引的值。 这会正确找到第一个逗号

int index = content.indexOf(",");

但是这个第二个子串使用了与前一个find相同的索引值:

... content.substring(0, index).c_str()  // ERROR - index is the last value

所以当字符串缩减为:

content -> "52,231"

索引返回 2

然后你砍掉逗号并

content -> "231"

代码需要2个字符才能得到23个字符。

如果您将输入更改为

"RGBLED,43.61,5,231"

最后一次你会得到“2”。

如果您将输入更改为

"RGBLED,43.61,52.,231"

你最后会得到“231”。

没有必要采取减少字符串的方法。 indexOf采用第二个可以指定起点的参数。

此代码正在寻求更好的解决方案,因为您不使用内存来重新分配内容字符串 - 它只是找到逗号并处理这些部分:

index1 = content.indexOf(",");
index2 = content.indexOf("," , index1+1);
index3 = content.indexOf("," , index2+1);

led1Color[0] = atof(content.substring(index1+1, index2).c_str());
led1Color[1] = atof(content.substring(index2+1, index3).c_str());
led1Color[2] = atof(content.substring(index3+1).c_str());