2012-03-28 88 views
4

好的,我已经从串行与Arduino中获取一个字符串,我甚至没有运气,甚至复制和粘贴示例。Arduino无法正确读取串行

我想从串行中获取一个字符串。这里是我的代码:

void setup() { 
    Serial.begin(9600); 
    Serial.write("Power On"); 
} 

void loop() 
{ 
    while(!Serial.available()); 

    while (Serial.available() > 0) { 
     Serial.write(Serial.read()); 
    } 
    Serial.println(); 
} 

而且它逐个打印字符。

我也试过

char* read(int len) { 
    while (!Serial.available()); 
    char str[len]; 
    int i = 0; 
    while (i < len) { 
    str[i] = '\0'; 
    int inByte = Serial.read(); 
    Serial.println(inByte); 
    if (inByte == -1) { 
     return str; 
    } else { 
     str[i++] = inByte; 
    } 
    } 
    return str; 
} 

而且它在一个时间(serial.print(inByte)给出-1隔日一次)返回1个字符。为什么串行分割每个字符?

如果我输入“hello”,并且我打电话给serial.read(),它会给出一个字符,然后说什么都没有,然后给出另一个字符并且说什么都没有。

+0

串口很慢。你通常一次只得到一个字节,然后一段时间没有。你需要在你的代码中处理这个问题,你现在没有这样做。 – 2012-03-28 13:08:07

回答

7

我想通了。

当您打开一个9600波特的串行(Serial.begin(9600);)时,它的读/写速度为每秒9600字节。这意味着最快可以达到每毫秒10个字节。我不知道运行速度是多少,但似乎Arduino会在第二个到达之前得到警报并读取第一个字节。因此,您必须添加一个delay(1)以“等待”“同一个流”中的另一个字节到达。

String read() { 
    while (!Serial.available()); //wait for user input 
    //there is something in the buffer now 
    String str = ""; 
    while (Serial.available()) { 
     str += (char) Serial.read(); 
     delay(1); //wait for the next byte, if after this nothing has arrived it means the text was not part of the same stream entered by the user 
    } 
    return str; 
} 

你可能会问,也因为你推迟你怎么知道,如果用户只是打字速度非常快?你不能在这里避免它,因为Serial基本上是以一定的速度受到限制的。然而,用户必须打字几乎不可能 - 对于两个输入被混淆为一个输入。

2

我没有进入这里的Arduino的源文件,但下面的代码行不会给你的原因很明显(让我知道,如果它不是那么明显)一个完整的字符串:

int inByte = Serial.read(); 

此外,使用

Serial.write() 

您要发送的每一个字节一个字节。这是从

Serial.println() 

oposite其中你将发送完整的句子。

我会尝试使用Serial.print()或println()而不是Serial.write()。

您可以检查出的参考文献:

http://arduino.cc/en/Serial/Println

0

它通过UART传输数据时存在延迟。尝试使用Serial.timedRead()来代替。代码如下。

void setup() { 
    Serial.begin(9600); 
    Serial.write("Power On"); 
} 

void loop() 
{ 
    while(!Serial.available()); 

    while (true) { 
     int byte = Serial.timedRead(); 
     if(byte == -1) 
     break; 
     Serial.write(byte); 
    } 
    Serial.println(); 
} 
1

即使这篇文章已经很老了,我会发布我的答案,以防有人在这里使用他们的方式。

对于从串口读取的字符串,你可以使用以下命令:

String str; 

while (Serial.available() > 0) { 
    str = Serial.readString(); 
} 

就像一个魅力!

-2
String str; 

void setup() 
{ 
    Serial.begin(9600); 
} 

void loop() 
{ 
    while (Serial.available() > 0){ 
     char c = Serial.read(); 
     str.concat(c); 
     if (Serial.available() == 0) 
     { 
      Serial.print(str); 
      str = ""; 
      break; 
     } 
    } 
}