Arduino 串行返回奇怪的数字 + 无法将 char 数组转换为 int C++
Posted
技术标签:
【中文标题】Arduino 串行返回奇怪的数字 + 无法将 char 数组转换为 int C++【英文标题】:Arduino Serial Return Weird Numbers + Trouble converting char array to int C++ 【发布时间】:2016-04-03 23:28:11 【问题描述】:我正在使用此代码进行项目:
#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 软件有问题?
非常感谢任何帮助!!!!
-加布里埃尔
编辑:感谢 Mitch Wheat 提醒我串行终端正在将我的 'numstr' 变量输出为 ASCII ......现在我只是想知道:
-
如何将 char 数组 'num' 转换为 int,以便在串行监视器中看到正确的输出
我的串行监视器似乎没有得到正确的输出......“10:15”似乎没有返回两个语句“10”和“15”......李>
我也尝试像这样使用 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;
它应该将字符串(我首先输入的数字)转换为 int,但是当我尝试编译它时,它说:
cannot convert 'String::toInt' from type 'long int (String::)()const' to type 'int'
我不确定我做错了什么......
【问题讨论】:
"所以,它不仅认为 '1' 是 '49'" : ascii '1' IS 49 @MitchWheat 那么这是否意味着我的代码正确解析了这两个数字,只是输出的语言与我输入的语言不同? “只是输出的语言与我输入的语言不同?” - 它与语言无关:它是表示。字符是编码的整数 @MitchWheat 那么如何将我的 char 数组转换为 int 呢?我试着做 Serial.println(atoi(num));因为我认为 atoi 将 char 数组转换为 ints,但是当我尝试将它上传到板上时,它说:“从 'int' 到 'const char*' [-fpermissive] 的转换无效”,这使得它看起来像 atoi应该将 int 转换为 char 数组....? 提示:atoi 将字符串转换为整数...cplusplus.com/reference/cstdlib/atoi 【参考方案1】:我现在使用的 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, ":"));
希望能如你所愿。
【讨论】:
谢谢,我会尝试并回复您 好的,所以我试了一下,它给了我这个错误:“从 'const char*' 到 'char*' [-fpermissive] 的无效转换”在这一行:“Serial.println(strtok (input.c_str(), ":"));"另外,什么是CR?请原谅这个愚蠢的问题,因为我是这些函数和这段代码的菜鸟...... CR 代表“回车”,一个 ASCII 码为 13 的字符,经常用作行终止符。或者,您应该检查 (char)10(LF - 换行)或 char(0)(用于终止 C 中的字符串)。 好的,谢谢...现在我只是想知道为什么它给了我无效的转换错误? 关于错误,请尝试以下方法看是否通过: Serial.println((char*)strtok(input.c_str(), ":")) ;或 Serial.println(strtok((char*)input.c_str(), ":")) ;或 Serial.println((char*)strtok((char*)input.c_str(), ":")) ;以上是关于Arduino 串行返回奇怪的数字 + 无法将 char 数组转换为 int C++的主要内容,如果未能解决你的问题,请参考以下文章
C ++ Linux(Ubuntu)正确写入串行(对于Arduino)