Arduino Serial Return 奇怪的数字 + 无法将 char 数组转换为 int C++

Arduino Serial Return Weird Numbers + Trouble converting char array to int C++

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

#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”的输入将 return 3 个输出,“10”、“15”和“20” .

我的问题是,当我在串行终端中发送字符串“10:15:20”时,return是这样的:

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”,结果 return 是这样的:

original: 49
49
49

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

为什么会这样?是我的代码有问题,还是arduino/arduino软件有问题?

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

-加布里埃尔

编辑:感谢 Mitch Wheat 提醒我串行终端正在将我的 'numstr' 变量输出为 ASCII...。现在我只是想知道:

  1. 如何将 char 数组 'num' 转换为 int 以便我可以在串行监视器中看到正确的输出
  2. 我的串行监视器似乎没有得到正确的输出....“10:15”似乎没有 return 两个语句“10”和“15” “...

我也试过像这样使用 atoi() 打印输出:

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

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


大编辑:

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

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

#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;

它应该将字符串(我首先输入的数字)转换为 int,但是当我尝试编译它时它说:

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

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

我现在使用的 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, ":"));
}

希望会做你想做的事。