Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino problème objet Serial

Je n'arrive pas à faire un simple Test avec la communication en série.

Sujet résolu
    20 octobre 2013 à 18:54:59

    Bonsoir !
    Je débute en Arduino, et j'ai récemment entendu  parlé de cet objet "Serial" me permettant une communication en série avec l'arduino depuis le moniteur de série de mon ordinateur. Histoire de voir comme ce truc fonctionne j'ai procédé à quelques tests avec la led du pin 13. J'arrive bien à l'allumer ou à l’éteindre selon le caractère envoyé. Maintenant j'ai voulu faire pareil avec une chaine de caractères par exemple j'envoie "MDP", la led s'allume sinon elle ne s'allume pas. Alors maintenant je veux rajouter une fonction qui éteint la led lorsque je rentre "Reset" par exemple. Voici le code que j'ai saisi pour cela:
    void setup()
    {
      Serial.begin(9600);
      pinMode(13,OUTPUT);
      digitalWrite(13,LOW);
    }
    String PassWord="MDP";
    String PassWordSend="";
    char Lettre=0;
    void loop()
    {
       while(Serial.available()>0)
       {
         Lettre=Serial.read();
         PassWordSend=PassWordSend+Lettre;
       }
       Serial.println(PassWordSend);
       Serial.flush(); 
    /*Sans cette ligne la LED ne s'allume pas même lorsque je rentre le mot de passe ... Je crois que c'est une question de synchronisation mais je n'en suis pas sur...*/
       if(PassWordSend==PassWord)
       { 
         digitalWrite(13,HIGH);
       }
       if(PassWordSend=="Reset")
       {
         digitalWrite(13,LOW);
       }
    }
    Avec ce code lorsque je rentre MDP depuis le moniteur, la LED s'allume mais impossible de l'éteindre. 
    Maintenant je modifie le code afin de pouvoir éteindre la LED à tout moment
    void setup()
    {
      Serial.begin(9600);
      pinMode(13,OUTPUT);
      digitalWrite(13,LOW);
    }
    String PassWord="MDP";
    String PassWordSend="";
    char Lettre=0;
    void loop()
    {
      Serial.flush();
       while(Serial.available()>0)
       {
         Lettre=Serial.read();
         PassWordSend=PassWordSend+Lettre;
       }
       Serial.println(PassWordSend);
       Serial.flush();
       if(PassWordSend==PassWord)
       { 
         digitalWrite(13,HIGH);
       }
       if(PassWordSend=="Reset")
       {
         digitalWrite(13,LOW);
       }
    PassWordSend="";
    }
    Seulement là la LED ne s'allume plus ... Pourtant je vois bien défiler le mot de passe lorsque je le rentre... Je ne comprend pas...
    Quelqu'un peut il m'aider ? 
    Merci d'avance !!
    • Partager sur Facebook
    • Partager sur Twitter
      21 octobre 2013 à 23:33:48

      Il y a un problème dans tes boucles.

      En effet : while(Serial.available()>0) va boucler tant qu'il y a des données à recevoir.

      Mais c'est impossible de taper au clavier aussi vite que l'envoie d'une liaison série.

      Donc entre 2 caractères, ta boucle va s'arrêter avant que le mot de passe entier soit reçu.

      Ce n'est donc pas comme ça qu'il faut faire.

      Par contre, quand tu tapes ton mot de passe ou n'importe quoi, tu appuis toujours sur la touches "ENTER" à la fin.

      Il te faut donc te baser là dessus.

      void setup() {
          Serial.begin(9600);
          pinMode(13,OUTPUT);
          digitalWrite(13,LOW);
      }
      
      String serialCommand;
      char serialLetter;
      
      void loop()
      {
          
          serialCommand = "";
      
          // Boucle infinie (que l'on quitte lorsque l'on appuis sur la touche ENTER)
          for (;;) {
              
              // Si la com reçoit quelque chose, on lit le caractère et on le traite
              // Note : sinon, on ne fait rien (donc on reste dans la boucle infinie)
              if ( Serial.available() > 0 ) {
                  
                  // Lecture
                  serialLetter = Serial.read();
      
                  // Si c'est la touche ENTER, on quitte la boucle infinie
                  if ( serialLetter == '\r' || serialLetter == '\n' ) {
                      break;
                  }
      
                  // Si la boucle n'a pas été quitté, c'est que ce n'est pas la touche ENTER
                  // Donc on ajoute le caractère à la string
                  serialCommand += serialLetter;
                  
              }
      
          }
      
          // Dès que l'on arrive ici, c'est que la touche ENTER a été utilisée
          // Donc on va traiter la chaine reçue
      
          if ( serialCommand == "MDP" ) {
              digitalWrite(13, HIGH);
          }
      
          if( serialCommand == "Reset" ) {
              digitalWrite(13, LOW);
          }
      
          // Fin du traitement,
          // Fin de la fonction loop
          // => c'est reparti pour un tour 
      
      }



      • Partager sur Facebook
      • Partager sur Twitter
        30 octobre 2013 à 20:23:27

        Super ça fonctionne ! :) Merci beaucoup pour votre aide. J'ai compris le truc ! (En plus je ne connaissais pas cette fonction break permettant de sortir d'une boucle infinie)
        • Partager sur Facebook
        • Partager sur Twitter
          30 octobre 2013 à 21:50:01

          Pour les boucles (que ce soit un wwhile ou un for), il existe 2 instructiions très pratique :

          - break => permet de stopper la boucle

          - continue => permet de revenir au début de la boucle

          Exemple :

          printf("DEBUT");
          for ( int i = 0 ; i < 5 ; i++ ) {
              printf("AVANT : i=%d", i);
              if ( i == 2 ) {
                  break;
              }
              printf("APRES : i=%d", i);
          }
          printf("FIN");
          
          /* Va afficher :
          
          DEBUT
          AVANT i=0
          APRES i=0
          AVANT i=1
          APRES i=1
          AVANT i=2
          FIN
          
          */
          
          printf("DEBUT");
          for ( int i = 0 ; i < 5 ; i++ ) {
              printf("AVANT : i=%d", i);
              if ( i == 2 ) {
                  continue;
              }
              printf("APRES : i=%d", i);
          }
          printf("FIN");
          
          /* Va afficher :
          
          DEBUT
          AVANT i=0
          APRES i=0
          AVANT i=1
          APRES i=1
          AVANT i=2
          AVANT i=3
          APRES i=3
          AVANT i=4
          APRES i=4
          FIN
          
          (pas d'affichage de "APRES i=2" grace au continue)
          
          */
          
          



          -
          Edité par lorrio 30 octobre 2013 à 21:50:30

          • Partager sur Facebook
          • Partager sur Twitter
            31 octobre 2013 à 3:02:55

            Je vois, je garde ces deux fonctions sous le coude. Elles simplifient pas mal certaines situations, dans lesquelles on veut par exemple intégrer une exception sans ajouter de variables ou de conditions trop encombrantes.
            • Partager sur Facebook
            • Partager sur Twitter

            Arduino problème objet Serial

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown