使用indexOf在Arduino String中找不到char时出错

时间:2014-11-17 09:32:15

标签: string arduino

我有一些代码,我不知道为什么它不起作用。

代码采用" xxx,yyy,zzz"形式的串行输入,其中每个数字的数字范围为1到3。由于应用程序中存在奇怪的怪癖,因此需要将其作为char读取,然后转换为要处理的字符串。目的是分为3个整数,红绿色和蓝色,来自" RRR,GGG,BBB"。

现在,当我手动定义String str(请参阅注释代码)时,这可以正常工作,但是当我从串行控制台输入它时,它并不想工作。它似乎来自indexOf(',')部分,因为在使用Serial.print(c1);时,我发现当我手动输入字符串时,它返回了逗号的索引,但是当我使用串行控制台时,它返回-1(未找到)。

是的,进入控制台的字符串格式正确为" RRR,GGG,BBB"我已经确认通过独立打印手机和str。

while (Serial.available() > 0) {
  char phone = Serial.read();
  String str = String(phone);
  //String str = "87,189,183";
  int ln = str.length()-1;
  int c1 = str.indexOf(','); //first place to cut string
  int c2 = str.indexOf(',',c1+1); //second place
  red = str.substring(0,c1).toInt();
  green = str.substring(c1,c2).toInt();
  blue = str.substring(c2,ln).toInt();
  Serial.print(red);

编辑:使用Arduino String类,从char创建一个字符串不仅仅返回一个字符,实际上是十一个字符。

3 个答案:

答案 0 :(得分:1)

此:

char phone = Serial.read();
String str = String(phone);

永远不会在str中创建一个包含超过1个字符的字符串,因为这就是您所说的内容。

这是the Arduino's String(char) constructor的代码:

String::String(char c)
{
  init();
  char buf[2];
  buf[0] = c;
  buf[1] = 0;
  *this = buf;
}

很明显,你的代码会创建一个1个字符的长字符串。

另外,请注意在完整字符串上使用索引,稍后在子字符串上使用。

答案 1 :(得分:1)

我试图猜测您使用的是这些串行API http://playground.arduino.cc/Interfacing/CPPWindows

while (Serial.available() > 0) {
  char buf[12];
  int len = Serial.ReadData(buf,11);
  String str = String(buf);
  //String str = "87,189,183";
  int ln = str.length()-1;
  int c1 = str.indexOf(','); //first place to cut string
  int c2 = str.indexOf(',',c1+1); //second place
  red = str.substring(0,c1).toInt();
  green = str.substring(c1,c2).toInt();
  blue = str.substring(c2,ln).toInt();
  Serial.print(red);

如果您使用的是http://arduino.cc/en/Serial/Read之类的其他API,则应遵循这些API,其中Serial为Stream,read()返回只是第一个可用的字符。

答案 2 :(得分:0)

使用不同的函数修复了代码。

while (Serial.available() > 0) {
char phone = Serial.read();
str += phone;
//String str = "87,189,183";
int ln = str.length()-1;
int c1 = str.indexOf(','); //first place to cut string
int c2 = str.indexOf(',',c1+1); //second place
red = str.substring(0,c1).toInt();
green = str.substring(c1,c2).toInt();
blue = str.substring(c2,ln).toInt();
Serial.print(red);

我不确定为什么会这样,以及为什么在我收到一个包含多个字符的字符串之前。但它有效!