2012-11-26 45 views
2

目前是大学的学生,决定跳过我的编程课,并有点儿用指针玩。这应该采取一个特定的串行输入,并改变我连接到Teensy ++ 2.0的三个LED的状态。但是,它似乎只是让我回到第一个输入。
http://arduino.cc/en/Serial/ReadBytesUntil
这是我对ReadBytesUntil引用()的输入变#,#,###(1,1,255就是一个例子)
我想基本上我的问题是,不ReadBytesUntil()处理逗号?如果是这样,这里发生了什么?输入字符串上的teensy指针

编辑 - 我问我的老师,甚至他不知道为什么它不起作用。

char *dataFinder(char *str){ 
    while (*str != ','){ 
    str++; 
    } 
    str++; 
    return str; 
} 

void inputDecoder(){ 
    str = incomingText; 
    whichLED = *str; 
    dataFinder(str); 
    onoff = *str; 
    dataFinder(str); 
    powerLevel = *str; 
} 



void loop(){ 
    int length; 
    if (Serial.available() > 0){  //this is basically: if something is typed in, do  something. 
length = Serial.readBytesUntil(13,incomingText, 10); //reads what is typed in, and stores it in incomingVar 
incomingText[length]=0; ///swapping out cr with null 
inputDecoder(); 
//ledControl(); 
Serial.print("Entered:"); 
//incomingText[9]=0; 
Serial.println(incomingText); //Here for testing, to show what values I'm getting back. 
Serial.println(whichLED); 
Serial.println(onoff); 
Serial.println(powerLevel); 
} 
    delay(1000); 
} 
+0

我很抱歉,如果这真的很愚蠢。这是我在此的头一篇博文。 – Solidus

+1

输出是什么? 'whichLED','onoff'和'powerLevel'应该分别为“1,1,255”,“1,255”,“255”,因为dataFinder()不是终止任何字符串的NUL。编辑:你没有使用'dataFinder()'的返回值,所以'str'在'inputDecoder()'中总是有相同的值,尝试'str = dataFinder(str);' – SpacedMonkey

回答

1

inputDecoder()str是从全球范围内,而不是在dataFinder()str,其具有局部范围。

想象一下这样的ASCII图片是内存的布局:

str 
+-----+-----+-----+-----+  +-----+-----+-----+-----+-----+-----+-----+-----+ 
| * |  |  |  | ... | 1 | , | 1 | , | 2 | 5 | 5 | \n | 
+--|--+-----+-----+-----+  +-----+-----+-----+-----+-----+-----+-----+-----+ 
    | 
    | 
    \-----------------------------^ 

当你传递strdataFinder()它创建的指针,我会打电话的副本str'

str   str' 
+-----+-----+-----+-----+  +-----+-----+-----+-----+-----+-----+-----+-----+ 
| * |  | * |  | ... | 1 | , | 1 | , | 2 | 5 | 5 | \n | 
+--|--+-----+--|--+-----+  +-----+-----+-----+-----+-----+-----+-----+-----+ 
    |   \-----------------^ 
    | 
    \-----------------------------^ 

dataFinder()增量str它确实在变化str'

str   str' 
+-----+-----+-----+-----+  +-----+-----+-----+-----+-----+-----+-----+-----+ 
| * |  | * |  | ... | 1 | , | 1 | , | 2 | 5 | 5 | \n | 
+--|--+-----+--|--+-----+  +-----+-----+-----+-----+-----+-----+-----+-----+ 
    |   \-----------------------------^ 
    | 
    \-----------------------------^ 

然后,当您返回到inputDecoder()时,您解除引用str,它仍指向字符串的开头。

您可以的str'值分配回使用全球str

str = dataFinder(str); 

或更改dataFinder()所以它不带任何参数,因此不能照搬变量。

+0

太棒了。这似乎解决了它。它最后不喜欢我的三位数字代码,但我可以用数学来解释这一点。非常感谢! – Solidus