2017-10-08 7 views
0

私は最初に無限ループを追加しました。 Dugmeはループの変数です。しかし、私はループを壊すことができませんでした。だから、私がループに入ると、私は終了できません。Arduinoがwhileループを壊している理由をデバッグするには?

void otoac() 
{ 
    long duration, distance; 
    while(dugme==1) 
    { 
     int distanceR = 0; 
     int distanceL = 0; 
     delay(40); 
     if(distance<=24) 
     { 
      moveStop(); 
      delay(100); 
      moveBackward(); 
      delay(300); 
      moveStop(); 
      delay(200); 
      distanceR = lookRight(); 
      delay(200); 
      distanceL = lookLeft(); 
      delay(200); 
      if(distanceR>=distanceL) 
      { 
       turnRight(); 
       moveStop(); 
      } 
      else 
      { 
       turnLeft(); 
       moveStop(); 
      } 
     } 
     else 
     { 
      moveForward(); 
     } 
     distance = readPing(); 
    } 
} 

「X」をクリックすると自動モード(アプリケーション)になるというコードがあります。私はここで 'X'をクリックすると 'x'(小さなx)をクリックすると停止する必要がありますが、停止しません。これは 'x'のコードです。私は、コマンドにwhileループを追加

だけでなく、コマンド、意味に矛盾、車がどうなるアクション:YouTubeで

void otokapa() 
{ 
    dugme=0 
    motor1.setSpeed(0); 
    motor2.run(RELEASE); //turn motor1 off 
    motor2.setSpeed(0); 
    motor2.run(RELEASE); //turn motor2 off 
} 

誰かが私だけこの答えを与えました三角形は押されておらず、何もありません。

もっとコード:

void loop(){ 
    if(Serial.available() > 0){ 
    command = Serial.read(); 
    Stop(); 
    switch(command){ 
    case 'F': 
     forward(); 
     break; 
    case 'B': 
     back(); 
     break; 
    case 'L': 
     left(); 
     break; 
    case 'R': 
     right(); 
     break; 
    case 'G': 
     onsol(); 
     break; 
    case 'I': 
     onsag(); 
     break; 
    case 'H': 
     arkasag(); 
     break; 
    case 'J': 
     arkasol(); 
     break; 
    case 'W': 
     onac(); 
     break; 
    case 'w': 
     onkapa(); 
     break; 
    case 'X': 
     otoac(); 
     break; 
    case 'x': 
     otokapa(); 
     break; 
    } 
    } 
} 

とdugme:本質的には、このすべてのコードint dugme=1;とdugmeの上

のみ無効otokapaにし、otoac while(dugme==1)

+1

C!= C++。実際に使用している言語のタグを付けます。 – tambre

+0

そして 'otokapa'関数はどこで呼びますか? Arduinoは 'otacapa'を' ootac'から(直接的または間接的に他の関数を通して)呼び出さない限り、 'dugme'は決して' 0'に設定されません(あなたが別の場所で行うのでない限り)。 –

+0

さらに、長時間走っているループは本当にあなたがArduinoでやるべきことではありません。 'loop'グローバル関数はループ内で呼び出されます。好ましくは、* one *を実行し、' loop'関数が再び呼び出されるようにします。 –

答えて

0

であるされているものあなたの問題はどう?

int dugme = 1; // one and only definition of this (ODR) 

void otoac() { 
    long duration, distance; 
    while(dugme==1) { 
    } 
} 

void otokapa() { 
    dugme=0; 
} 

void loop(){ 
    if(Serial.available() > 0){ 
    command = Serial.read(); 
    Stop(); 
    switch(command){ 
    case 'X': 
     otoac(); 
     break; 
    case 'x': 
     otokapa(); 
     break; 
    } 
    } 
} 

ODRのエラー違反が考えられます。

loopotoacが同じスレッドで実行されている場合は、シリアルに再度アクセスすることはありません。

+0

はい、さらにvoid otoacとotokapaの余分なコード。しかし、あなたはすでにそれを知っています。どうすればこの問題を解決できますか?アプリケーションの同じボタンをタップするとコードを停止させるのは簡単でしょうか?何かを考え出すことができますか? – GesterFromHolland

+0

'loop'ではotoacを直接呼び出します。otoacは独自のスレッドで実行する必要があります。ループは' 'x ''をチェックし、' otokapa'で停止させます。 – Surt

+0

どのループですか?あなたはwhileループを意味しますか?あなたは私のための例を作ることができますか?私はそれを試したので、私はエラーが発生したので、私は再び固執した。私はちょうどarduinoについて4週間の授業をしていたので、これに関する私の知識は非常に低いです。あなたはすでにそれを修正する方法を知っていますか?あなたがどうやって私に答えたら、私はxD – GesterFromHolland

関連する問題