2016-04-03 39 views
0

我正在使用此代码的项目:Arduino的串行返回奇异数+故障转换的字符数组为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”将返回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

编辑:感谢米奇小麦带来了我的注意串口终端输出了我的“numstr”变量作为ASCII ....现在我只是想知道:

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

我也试图打印使用输出的atoi()是这样的:

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

但无济于事......(我不知道我是否被正确使用的atoi,所以这可能是无关的,但我会添加它。


BIG编辑:

确定。所以,感谢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' 

我不知道我做错了什么......

+0

“所以,它不仅认为'1'是'49'”:ascii'1'IS 49 –

+0

@MitchWheat因此,这意味着我的代码正确解析了两个数字,它只是不以相同的语言输出我输入了什么? –

+0

“它只是不是用我输入的同一种语言输出的?” - 它与语言无关:代表性。字符编码整数 –

回答

0

我不哈VE Arduino的安装在PC I“M使用的是现在,所以我希望我得到这个权利...

一件事,你的代码的方式比必要 更复杂,您可以简化

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, ":")); 
} 

希望能做到你想要的。

+0

谢谢我会试试看,并回复你 –

+0

好的,所以我试了一下,它给了我这个错误:“无效转换从'const char *'到'char *'[-fpermissive]”在这一行:“ Serial.println(strtok(input.c_str(),“:”));“另外,什么是CR?请原谅愚蠢的问题,因为我是这些函数和此代码的noob ...。 –

+0

CR代表“回车”,一个ASCII代码为13的字符,它经常用作行终止符。或者,您应该检查(char)10(LF - 换行)或char(0)(用于终止C中的字符串)。 –