2012-03-28 94 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; 
     } 
    } 
}