2017-10-08 7 views
0

J'ai d'abord ajouté une boucle infinie. Dugme est une variable pour la boucle. Mais je ne pouvais pas casser la boucle. C'est pourquoi, quand j'entre dans la boucle, je ne peux pas sortir.Comment déboguer pourquoi Arduino casse une boucle 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(); 
    } 
} 

J'ai un code que lorsque je clique sur case: 'X' ça passe en mode automatique (application). J'ai ici le code pour quand je clique sur 'X' c'est 'x' (petit x) il doit s'arrêter mais ça ne s'arrête pas. C'est le code pour le 'x'.

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

Quelqu'un sur YouTube ne m'a donné cette réponse:

J'ai ajouté une boucle while à la commande, ainsi que d'une contradiction avec la commande, ce qui signifie, l'action que la voiture fera quand le triangle n'est pas pressé, ce qui n'est rien.

Plus code:

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; 
    } 
    } 
} 

et dugme:

au-dessus de tout le code int dugme=1; et dugme est seulement dans otokapa vide et otoac while(dugme==1)

+1

C! = C++. Tag avec la langue que vous utilisez réellement. – tambre

+0

Et où appelez-vous la fonction 'otokapa'? Arduino ne fonctionne pas en parallèle, sauf si vous appelez 'otokapa' de' oatac' (directement ou indirectement via une autre fonction) alors 'dugme' ne sera jamais défini sur' 0' (sauf si vous le faites ailleurs). –

+0

En outre, les boucles de longue durée ne sont vraiment pas comment vous devriez faire des choses sur Arduino. La fonction globale 'loop' sera appelée dans une boucle, vous devriez de préférence faire * une * chose dedans, et laisser la fonction' loop' revenir pour être appelée à nouveau. –

Répondre

0

Est-ce essentiellement ce que votre problème ressemble?

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; 
    } 
    } 
} 

Erreurs possibles de violation d'ODR.

si loop et otoac s'exécute dans le même thread, vous ne pourrez plus jamais accéder à la série.

+0

Oui, plus le code supplémentaire dans void otoac et dans otokapa. Mais vous le savez déjà bien sûr. comment pouvons nous résoudre ceci? Il devrait être facile de laisser le code arrêter quand je tape le même bouton dans l'application droite? Pouvez-vous trouver quelque chose? – GesterFromHolland

+0

Dans 'loop' vous appelez otoac directement, otoac doit fonctionner dans son propre thread puis loop est libre de vérifier '' x '' et de l'arrêter avec' otokapa'. – Surt

+0

Dans quelle boucle? tu veux dire dans la boucle while? Pouvez-vous faire un exemple pour moi. Parce que j'ai essayé mais j'ai eu des erreurs donc je suis coincé à nouveau. Je viens d'avoir 4 semaines de cours sur l'arduino, donc mes connaissances à ce sujet sont très faibles. Savez-vous comment le réparer déjà? Parce que si vous me répondez comment vous avez fait, je ne comprendrai pas xD – GesterFromHolland