IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Problème sur boucle While


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut Problème sur boucle While
    Il y a un truc que je comprend pas dans les codes suivants.
    Ca c'est le code d'une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    void Maj_Date()
    {
     
      //Le booléen passe à faux
      DCF77 = false;
     
      //Boucle de x cycles avec sortie si DCF77 = true
      while (essai < 10) 
      {
        static uint8_t longueur = 0;
        bool trame_decodee = decodeurDCF77.traiterSignal(digitalRead(PIN_DCF77), millis());
     
        Serial.print("Oui");
     
        if (trame_decodee) 
        {
          Serial.print(' ');
          //Serial_printDCF77();
          DCF77 = true;
          Serial.print("Oui");
        }
     
        if (longueur > decodeurDCF77.longueur_trame_en_cours())
        {
          longueur = 0;
          Serial.println();
          essai = essai + 1;
          Serial.print("Nombre d'essai :");
          Serial.print(essai);
          Serial.println();
        }
     
        while (longueur < decodeurDCF77.longueur_trame_en_cours()) 
        {
          Serial.print(decodeurDCF77.bit_trame(longueur++));
        }
      }
     
    }
    J'y déclenche une boucle qui doit se répéter 10 fois et ça semble bien fonctionner

    Mais là ou je ne comprend pas c'est pour cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        while (longueur < decodeurDCF77.longueur_trame_en_cours()) 
        {
          Serial.print(decodeurDCF77.bit_trame(longueur++));
        }
    Selon moi, elle devrait se dérouler sans sortir tant que longueur est < à la longueur de trame du DCF77 non ?
    Or ça n'est pas le cas.
    Pour tester, j'ai mis un Serial.print en dehors de cette boucle et il est répété indéfiniment

    Je ne comprend pas

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 914
    Par défaut
    pas simple de lire le code hors contexte, qui appelle la fonction Maj_Date ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut
    Voici le code complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include <Arduino.h>
    #include "decodeurDCF77.h"
     
    const uint8_t PIN_DCF77 = 3;
    bool Date_Sync = false;
    byte essai = 0;
    byte Date_Jour = 0;
     
    //Initialisation
    void setup()
    {
      pinMode(PIN_DCF77, INPUT);
      Serial.begin(115200);
    }
     
    //Programme principal
    void loop() 
    {
      //Mise à jour de la date et de l'heure si 
      if ((Date_Sync = false) || (Date_Jour = 5))
      {
        Maj_Date();
      }
    }
     
     
    void Maj_Date()
    {
     
      //Le booléen passe à faux
      Date_Sync = false;
     
      //Boucle de x cycles avec sortie si DCF77 = true
      while (essai < 10) 
      {
        static uint8_t longueur = 0;
        bool trame_decodee = decodeurDCF77.traiterSignal(digitalRead(PIN_DCF77), millis());
     
        if (trame_decodee) 
        {
          Serial.print(' ');
          //Serial_printDCF77();
          Date_Sync = true;
          Serial.print("Oui");
        }
     
        if (longueur > decodeurDCF77.longueur_trame_en_cours())
        {
          longueur = 0;
          Serial.println();
          essai = essai + 1;
          Serial.print("Nombre d'essai :");
          Serial.print(essai);
          Serial.println();
        }
     
        while (longueur < decodeurDCF77.longueur_trame_en_cours()) 
        {
          Serial.print(decodeurDCF77.bit_trame(longueur++));
        }
      }
    }
    La fonction est appelée dans le loop

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 914
    Par défaut
    où trouve-t-on le decodeurDCF77.h en question?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut
    Bonne question,,

    Je l'ajoute en pièce jointe
    Fichiers attachés Fichiers attachés

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut
    Merci de ton aide Jay ;-)
    Le problème viendrait de la librairie selon toi ?

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 914
    Par défaut
    Citation Envoyé par lololebricoleur Voir le message
    Merci de ton aide Jay ;-)
    Le problème viendrait de la librairie selon toi ?
    Je ne sais pas mais il faut comprendre ce que font les fonctions pour comprendre ce qu'il se passe - donc c'est mieux de voir tout le code (surtout qu'il y a des variables globales)

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut
    ok

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 914
    Par défaut
    OK j'ai regardé et en fait il ne faut pas augmenter le nombre d'essais dans ce test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (longueur > decodeurDCF77.longueur_trame_en_cours())
    car il va être vrai quand vous aurez obtenu l'information correcte (quand trame_decodee est vrai). en effet la bibliothèque remet à 0 la trame une fois que la date/heure ont été obtenus et donc forcément la longueur précédente (qui correspond à la longueur totale de la trame) sera plus grand que 0. ce n'est pas un signe que ça s'est mal passé, @bricoleau utilisait cela pour passer à la ligne dans l'affichage de la trame dans son code de démo

    Si vous ne voulez faire que 10 essais, vous pourriez éventuellement rajouter un bout de code qui essaye d'obtenir l'info que pendant 11 minutes par exemple? ça laisserait le temps à 10 trames d'arriver, donc 10 chances de lire une trame correcte

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    Par défaut
    Merci de votre aide,

    Dsl, pas certain d'avoir bien compris ou de m'être biene expliqué

    Mon problème ne concernne pa la gestion du nombre d'essai.
    Mon problème c'est que cette boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        while (longueur < decodeurDCF77.longueur_trame_en_cours()) 
        {
          Serial.print(decodeurDCF77.bit_trame(longueur++));
        }
    Ne semble pas en être une de boucle en fait
    Elle semble ne s'éxécuter qu'une seule fois à chaque fois
    Pour le vérifier j'ai mis un Serial.print(longueur); et on voit bien qu'il est excuté en permamence
    Ou alors je ne comprend pas ce que fait cette boucle

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 914
    Par défaut
    Ca permet de rattraper des octets si par hasard on était désynchronisé, en gros ça vous assure que ce qui est imprimé correspond à l’intégralité du buffer déjà reçu, sinon ça rattrape.

    Ici comme vous recevez et affichez en même temps, il n’y a pas de décalage possible donc la boucle imprime le denier byte reçu et c’est à la prochaine seconde que vous aurez le prochain charactere

Discussions similaires

  1. [MySQL] Problème sur boucle WHILE
    Par t671 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 19/09/2012, 22h37
  2. [MySQL] Problème sur Boucle While après un LEFT JOIN
    Par matperino dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 28/05/2007, 17h43
  3. [MySQL] Problème de boucle while
    Par Justin_C dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/12/2006, 19h16
  4. Réponses: 3
    Dernier message: 11/06/2006, 12h09
  5. [MySQL] Problème de boucle while sur base de données
    Par Darhyl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 05/05/2006, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo