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)

使用 I2C 从 arduino 上的模拟引脚读取值并将其发送到树莓派。它返回奇怪的数字,如 122 或 255

通过串行读取 utf8 时,Arduino 行为异常

如何将串行输入存储在char数组arduino中?

arduino 有时上电无法复位

python和arduino之间的串行通信