2012-03-28 11 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

シリアルポートは非​​常に遅いです。一度に1バイトずつ取得し、しばらくは取得しません。コード内でこれを処理する必要がありますが、今はそうしていません。 –

答えて

7

私はそれを理解しました。

シリアルを9600ボー(Serial.begin(9600);)で開くと、9600バイト/秒で読み書きされます。これは、最速では1ミリ秒あたり10バイト以下になることを意味します。私は動作速度が何であるかはわかりませんが、Arduinoがアラートされ、2番目のバイトが到着する前に最初のバイトを読み取るように思えます。したがって、同じストリームの別のバイトが到着するまで「待機」するには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; 
} 

ユーザーがちょうど非常に速く入力された場合にどのようにあなたは知っています遅延しているので、あなたも、求めることができますか?シリアルは本質的にあるスピードで制限されているので、ここでは避けることはできません。しかし、ユーザーは、2つの入力が1つの入力と混同されるためには、実質的に不可能な速さで入力する必要があります。

2

(それがその明白でなければ、私に知らせて)私はここでArduinoのソースファイルにアクセスすることはできませんが、次のコード行は、あなたの明白な理由のための完全な文字列を与えることはありません。

int inByte = Serial.read(); 

また、あなたがバイトごとにバイトを送信することがあります

Serial.write() 

を使用。それは、あなたが完全な文章を送るだろう

Serial.println() 

からのオポジストです。

私はSerial.write()や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; 
     } 
    } 
} 
関連する問題