Arduino Serial返回奇怪的数字+将char数组转换为int C ++的麻烦

时间:2016-04-03 23:28:11

标签: c++ arduino serial-port strtok

我正在使用此代码开发一个项目:

#include <string.h>
void setup()
{
Serial.begin(9600);
}
void loop()
{

if (Serial.available()) {
String input = String(Serial.read());
Serial.println("original: " + input);
char inputarray[100];
input.toCharArray(inputarray, 100);
  char *message = inputarray;
  char* num;


  num = strtok(message, ":");
  String numstr(num);
Serial.println(numstr);


  num = strtok(NULL, ":");
 String numstr2(num);
Serial.println(numstr);


}

delay(500);

}

它应该从串口读取输入并解析它,以便输入“10:15:20”将返回3个输出,“10”,“15”和“20”。

我的问题是,当我在串口终端发送字符串“10:15:20”时,它会返回:

original: 49
49
49
original: 48
48
48
original: 58
58
58
original: 49
49
49
original: 53
53
53
original: 58
58
58
original: 50
50
50
original: 48
48
48

现在,我真的很困惑。我尝试在序列中输入一个数字,比如'1',然后返回:

original: 49
49
49

因此,它不仅认为'1'是'49',当我输入类似“10:15:20”的东西时,它会将程序循环8次,同时将该语句用作“输入”。

为什么会这样?我的代码有问题,或者arduino / arduino软件有问题吗?

非常感谢任何帮助!!!!

-Gabriel

编辑:感谢Mitch Wheat引起我的注意,串行终端输出我的'numstr'变量为ASCII ....现在我只是想知道:

< STRONG>
  1. 如何将char数组'num'转换为int,以便在串行监视器中看到正确的输出
  2. 似乎我没有在我的串口监视器中获得正确的输出....“10:15”似乎没有返回两个语句“10”和“15”...
  3. 我还尝试使用atoi()打印输出,如下所示:

    num = strtok(message, ":");
        Serial.println(atoi(num));
    

    但无济于事......(我不确定我是否正确使用了atoi,所以这可能无关紧要,但我会永远添加它。

    大编辑:

    确定。所以,感谢Alphonsos_Pangas,我能够正确打印并验证我的strtok()是否正常工作。

    然而,现在我的问题是当我尝试转换我从strtok()获得的字符串时;到一个int,我得到一个错误。我一直在使用这段代码:

    #include <string.h>
    
    String data[4];
    
    void setup()
    {
    Serial.begin(9600);
    }
    
    void loop()
    {
    
    if (Serial.available()) {
    
       String input = String(Serial.readStringUntil((char)13));
       Serial.println("original: " + input);
       //Serial.println(atoi(input.c_str()));
      // Serial.println(strtok(input.c_str(), ":"));
    
      data[0] = ((char*)strtok((char*)input.c_str(), ":"));
      Serial.println(data[0]);
    
      int testint = data[0].toInt;
    
      data[1] = (strtok(NULL, ":"));
      Serial.println(data[1]);
    
      data[2] = (strtok(NULL, ":"));
      Serial.println(data[2]);
    
      data[3] = (strtok(NULL, ":"));
      Serial.println(data[3]);
    }
    
    delay(500);
    Serial.println("end");
    }
    

    除了这一行之外,一切正常:

     int testint = data[0].toInt;
    

    它应该将String(我放在第一个中的数字)转换为int,但是当我尝试编译它时它会说:

    cannot convert 'String::toInt' from type 'long int (String::)()const' to type 'int'
    

    我不确定我做错了什么......

1 个答案:

答案 0 :(得分:0)

我现在没有在PC上安装Arduino,所以我希望我能做到这一点......

首先,您的代码比必要的复杂得多 你可以简化

num = strtok(message, ":");
String numstr(num);
Serial.println(numstr);

num = strtok(NULL, ":");
String numstr2(num);
Serial.println(numstr);

作为

Serial.println(strtok(input.c_str(), ":"));
Serial.println(strtok(NULL, ":"));

此外,

String input = String(Serial.Serial.readStringUntil((char)13));

可能更接近你想要的(假设输入字符串以CR终止)

if (Serial.available()) {
   String input = String(Serial.Serial.readStringUntil((char)13));
   Serial.println("original: " + input);
   Serial.println(atoi(input.c_str()) ;
   Serial.println(strtok(input.c_str(), ":"));
   Serial.println(strtok(NULL, ":"));
}

希望能做你想做的事。