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

Plateformes Discussion :

Boucle qui ne s'arrête pas


Sujet :

Plateformes

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut Boucle qui ne s'arrête pas
    Bonjour,

    J'ai une boucle While qui fonctionne cependant je veux exécuter plusieurs commandes.
    Le script finit par bloquer à une commande et ne lance pas celle d'après. En plus, une fois les commandes lancées, je ne trouve pas la condition qui pourrait faire que la boucle s'arrête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            char b[] = "ZynqMP";
            while (serial.waitForReadyRead() && rest != 0)
            {
                QByteArray data = serial.readAll();;
                rest = strcmp(data, b);
                qDebug() << data.toStdString().c_str();
                serial.write("123\n");
                QByteArray readLine;
                serial.write("setenv ipaddr 192.168.0.222\n");
                serial.write("setenv serverip 192.168.0.36\n");
                serial.write("saveenv\n"); 
                serial.write("tftpboot 0x10000000 boot.scr\n");
             }
    Merci à tous ceux qui prendront le temps de m'aider.

  2. #2
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Points : 1 466
    Points
    1 466
    Par défaut
    Salut,

    Essaye en changeant l'ordre d'évaluation de ta condition while:
    while (rest != 0 && serial...

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Merci de ta réponse.
    Ça n'a malheureusement pas changé le problème.

    En plus les commandes "saveenv" et "tftpboot" continue de fonctionner. Mais si "saveenv" est lancé, "tftpboot" ne démarrera jamais. Un peu comme si elles effaçaient tout ce qui était écrit après elles.

    J'ai tenté avec une variable indépendante mais soit ça n'arrête pas le programme soit ça ne le lance même pas. Comme si une variable supplémentaire était prioritaire sur les commandes de "serial.write" peu importe l'ordre d'écriture.

  4. #4
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Points : 1 466
    Points
    1 466
    Par défaut
    Je n'utilise pas Qt mais essaye en remplaçant la ligne 5 par rest= qstrcmp(data.data(), b);

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Ça n'a rien changé.

    C'est pas grave. Merce d'avoir essayé de m'aider.

  6. #6
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Points : 1 466
    Points
    1 466
    Par défaut
    Fournis un code un peu plus étoffé, ce qu'il est supposé lire et faire sur le port série.
    Sinon, les fonctions membres suivantes devraient t'aider:
    https://doc.qt.io/qt-6/qiodevice.html#canReadLine
    https://doc.qt.io/qt-6/qiodevice.html#readLine

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Voilà globalement le code. En espèrent que ça aide un peu plus à le débloquer.

    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
     
    int main(int argc, char *argv[])
    {
        int a, rest = 1;
        char b[] = "ZynqMP";
        cout << "A quelle étape voulez vous vous rendre ? 0 pour toutes les faire.\n";
        cin >> a;
        QCoreApplication app(argc, argv);
        QSerialPort serial("/dev/ttyUSB0");
        serial.setBaudRate(115200);
        serial.setDataBits(QSerialPort::DataBits::Data8);
        serial.setParity(QSerialPort::Parity::NoParity);
        serial.setStopBits(QSerialPort::StopBits::OneStop);
        serial.setFlowControl(QSerialPort::FlowControl::NoFlowControl);
     
        if (serial.open(QIODevice::ReadWrite))
        {
            while (serial.waitForReadyRead() && rest != 0)
            {
                QByteArray data = serial.readAll();;
                rest = qstrcmp(data.data(), b);
                qDebug() << data.toStdString().c_str();
                serial.write("123\n");
                QByteArray readLine;
                if (a == 0 || a == 2)
                {
                    serial.write("setenv ipaddr 192.168.0.222\n");
                    serial.write("setenv serverip 192.168.0.36\n");
                    serial.write("saveenv\n"); 
                    serial.write("tftpboot 0x10000000 boot.scr\n");
                    serial.write("printenv ipaddr\n");
            }
        }
        else
        {
            qDebug() << QString("Error %1").arg(serial.errorString());
        }
     
        QSerialPortInfo description("/dev/ttyUSB0");
     
        serial.setPortName("ttyUSB0");
        return 0;
    }
    Il y a d'autre commande à faire mais si ça ne fait pas le "printenv" ça n'avancera pas peu importe la commande suivante je pense.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 408
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 408
    Points : 20 551
    Points
    20 551
    Par défaut
    Citation Envoyé par Yazuka2.0 Voir le message
    J'ai une boucle While qui fonctionne ce pendant je veux exécuter plusieurs commandes.
    dans le code donné il n'y a aucune instruction qui permette de vérifier si les commandes sur le port série se déroulent bien.
    Le code donné est insuffisant il faut tester une valeur de retour pour savoir si les instructions marchent bien.
    Par exemple QSerialPort::setBaudRate retourne un booléen donc vérifier à chaque fois si les commandes s'exécutent bien.
    Une fois que vous avez fait cela c'est un problème de synchronisation en apparence.

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    dans le code donné il n'y a aucune instruction qui permette de vérifier si les commandes sur le port série se déroulent bien.
    Le code donné est insuffisant il faut tester une valeur de retour pour savoir si les instructions marchent bien.
    Par exemple QSerialPort::setBaudRate retourne un booléen donc vérifier à chaque fois si les commandes s'exécutent bien.
    Une fois que vous avez fait cela c'est un problème de synchronisation en apparence.
    Je n'ai pas tout compris. Quand je lance le programme les commandes ont l'air de bien fonctionner puisque dans le terminal je vois les commandes se lancer.

    Comment fonctionne QSerial::setBaudRate exactement ?

  10. #10
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Points : 1 466
    Points
    1 466
    Par défaut
    Dans quel objectif ont été écrites les lignes 18 à 31 ?
    Qu'est supposé faire ce bout de code ou plutôt qu'en en attends-tu ?

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Dans quel objectif ont été écrites les lignes 18 à 31 ?
    Qu'est supposé faire ce bout de code ou plutôt qu'en en attends-tu ?
    Je lance le programme, il va lire ce qu'envoi la carte et écrire le mot de passe pour être connecté en série.
    Ensuite il écrit les commandes qui permettent de configurer la carte.

    Normalement il y a plusieurs "if" en fonction du nombre de commande à fournir mais pour l'instant je n'ai mis que le début.

  12. #12
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Points : 1 466
    Points
    1 466
    Par défaut
    Concentre-toi d’abord sur la lecture avant de chercher à écrire sur le port série. Je vais regarder pour te trouver un début de piste.

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    La partie lecture fonctionne. Je l'ai déjà vérifié plusieurs fois.

  14. #14
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Points : 1 466
    Points
    1 466
    Par défaut
    sous réserve,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    bool keep_reading= true;
    while (keep_reading) {
        if (serial.waitForReadyRead() && serial.canReadLine()) {
            QByteArray line= serial.readLine();
            qDebug()<< "line: "<< line<< '\n';
        }
     
        else {
            qDebug()<< "waiting for data...\n";
        }
    }
    Citation Envoyé par Yazuka2.0 Voir le message
    La partie lecture fonctionne. Je l'ai déjà vérifié plusieurs fois.
    Oui mais il faut que le code se comporte correctement sinon tu inondes le "buffer" du port série.

  15. #15
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Tu veux que je remplace par ce code à partir de la ligne 16 ?

    Si c'est ça, le programme ne fait qu'attendre. Il ne s'arrête pas contrairement à ce que j'ai tenté mais il ne bouge pas non plus.

  16. #16
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Oui mais il faut que le code se comporte correctement sinon tu inondes le "buffer" du port série.
    Je ne suis pas non plus une très grande professionnelle la dedans. Je viens a peine de commencer. Qu'est-ce que tu veux dire par inonder le "buffer" ? Et comment vérifier que cette partie du code se comporte correctement alors que la lecture a l'air de se faire correctement ?

  17. #17
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Points : 1 466
    Points
    1 466
    Par défaut
    Non à partir de la ligne 18, ta boucle while. Parce que là ton code écrit de manière inconditionnelle sur le port série. Ensuite pour arrêter ta boucle, il faut une condition et il faut la spécifier, ce peut être un mot envoyé par la carte par exemple.

  18. #18
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Je réfléchis depuis plusieurs jour à ce que pourrait être la condition de sortie mais je ne trouve rien.

    Le problème du code que tu viens de m'envoyer c'est qu'il ne fait que lire à coup de "line : ....."
    Ce n'est pas pratique et en plus je ne vois à aucun moment le texte indiquant qu'il faut mettre le mot de passe.

  19. #19
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    667
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 667
    Points : 1 466
    Points
    1 466
    Par défaut
    Qu'est ce qui est affiché exactement ?
    Pourquoi faire une boucle de lecture si ce que t'envoie ta carte ne t’intéresse pas ?

  20. #20
    Futur Membre du Club
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Octobre 2022
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2022
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Ce que renvoi la carte m'intéresse. Mais avec le code que tu as proposé je me suis perdu dans ce qu'envoi la carte.

    Avec ton code on a ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    line:  "Destination Device is PL, changing LoadAddress\r\n" 
     
    line:  "XPFW: Calling ROM PWRUP Handler..Done\r\n" 
     
    line:  "XPFW: Calling ROM Isolation Handler..Done\r\n" 
     
    line:  "Non authenticated Bitstream download to start now\r\n"
    Et de mon côté ce que j'obtiens habituellement ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Destination Device is PL, changing LoadAddress
    XPFW: Calling ROM PWRUP Handler..
    Done
    XPFW: Calling ROM Isolation Handler..Done
    Non authenticated Bitstream download to start now
    C'est la même chose mais pour retrouver une ligne en particulier c'est plus compliqué puisqu'elles démarrent toutes pareilles et que je n'arrive pas à insérer ma commande pour mettre le mot de passe. (Le petit "serial.write("123\n");")

Discussions similaires

  1. Boucle Loop While qui ne s'arrête pas avec mes conditions
    Par ourquiqui dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 17/06/2019, 23h12
  2. [XL-2010] Boucle For each qui ne s'arrête pas
    Par Gllou06 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 18/02/2017, 12h10
  3. Boucle for qui ne s'arrête pas
    Par Cha_rline dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/11/2015, 14h23
  4. [FLASH MX2004] Clip qui ne s'arrête pas
    Par romain starck dans le forum ActionScript 1 & ActionScript 2
    Réponses: 8
    Dernier message: 10/05/2006, 20h43
  5. [VBA-E]une boucle qui ne s'arrète pas
    Par vivelesgnous dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/02/2006, 19h05

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