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...。现在我只是想知道:
- 如何将 char 数组 'num' 转换为 int 以便我可以在串行监视器中看到正确的输出
- 我的串行监视器似乎没有得到正确的输出....“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, ":"));
}
希望会做你想做的事。
我正在使用此代码开发一个项目:
#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...。现在我只是想知道:
- 如何将 char 数组 'num' 转换为 int 以便我可以在串行监视器中看到正确的输出
- 我的串行监视器似乎没有得到正确的输出....“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, ":"));
}
希望会做你想做的事。