我正在使用此代码开发一个项目:
#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>我还尝试使用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'
我不确定我做错了什么......
答案 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, ":"));
}
希望能做你想做的事。