2016-04-11 212 views
0

最初、私はこのウェブサイトとarduinoを初めて使っていますので、これは単なる愚かな過ちであると確信しています。arduino whileループは一度だけ実行します

私はアルドゥイノの遊び人を作ることに取り組んでいます。これは不完全なので、現在はシリアル入力を受け取り、16x2のLCD画面にアンダースコアとスペースを付けます。

私のコードは次のようになります。

#include <LiquidCrystal.h> 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
String content = ""; 
int loopcount=0; 
int loopend; 
char character; 
void setup(){ 
    Serial.begin(9600); 
    lcd.begin(16, 2); 
    lcd.setCursor(0,1); 
    while(!Serial.available()){} 

    while(Serial.available()) { 
    character = Serial.read(); 
    delay(5); 
    content.concat(character); 
    } 

    loopend=content.length(); 

    while(!loopend==loopcount){ 
    if(content.charAt(loopcount)==' '){ 
    lcd.print(' '); 
    }else{ 
    lcd.print('_'); 
    } 

    loopcount++; 
    } 
} 

void loop(){ 
} 

問題は、印刷 'または' _ 'のいずれかのwhileループが1回だけ実行されることです。エラーメッセージが表示されず、最初の文字が正常に動作します。 ありがとうございます!

答えて

2

まず、コードの実際のエラーから始めましょう。あなたのループを見る

while(!loopend==loopcount){ 
    if (content.charAt(loopcount)==' '){ 
     lcd.print(' '); 
    } else { 
     lcd.print('_'); 
    } 
    loopcount++; 
} 

問題は、操作の順序です!オペレーター。 loopendがloopcountに等しいとすぐにループが終了するように見えるかもしれません。しかし、それが働くためには!(loopend == loopcount)またはloopend != loopcountと書かなければなりませんでした。それは最初にループエンドを否定し、ループカウントと比較します。これにより、loopendの値に関係なく、loopcountがゼロより大きいとすぐに条件がtrueに評価されます。ですから、どちらか一方の選択肢に修正するには(ただし、!=はもっと綺麗です)。

ただし、このようなエラーが発生しないようにするには、いくつかの設計変更があります。最初に、ループ反復変数(loopcountとloopend)がsetup関数の外部にスコープされる理由はありません。その関数内で宣言して初期化することができ、グローバルスコープを持たないようにすることができます。 whileループの代わりにforループを使用すると、エラーが発生する可能性が低くなります。これは、ループが意図したシナリオとまったく同じです。

それではループコードは

int len = content.length(); 
for (int i = 0; i < len; i++) { 
    if(content.charAt(i)==' '){ 
     lcd.print(' '); 
    } else{ 
     lcd.print('_'); 
    } 
} 

なる最後に、あなたが本当にあなたのコードをインデントする必要があります。あなたの開発環境内でコードが正しくインデントされているかどうかはわかりませんが、この質問ではちょうどうんざりしています。しかし、コードブロックの開始と終了の場所を調べる必要があるかどうかを確認するのがエラーをより困難にします。

0

これは

#include <LiquidCrystal.h> 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
String content = ""; 
int loopcount=0; 
int loopend; 
char character; 
    void setup(){ 
    Serial.begin(9600); 
    lcd.begin(16, 2); 
    lcd.setCursor(0,1); 
    } 

    void loop(){ 
    // while(!Serial.available()){} 
     while(Serial.available()) { 
     character = Serial.read(); 
     delay(5); 
     content.concat(character); 
     loopend=content.length(); 
    } 


while(loopcount < loopend){ 
    if(content.charAt(loopcount)==' '){ 
Serial.println(' '); 
    }else{ 
    Serial.print('_'); 
    Serial.print(" "); 
    loopcount++;} 
    } 

delay(5); 


    } 
を助け場合、私は知りません
関連する問題