我正在尝试使用串行通信解析发送到我的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 ++编程,所以有什么我想念的吗?为什么将三位数转换为两位数?
答案 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());