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 :

Entrée multiligne arduino


Sujet :

Arduino

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2021
    Messages : 3
    Par défaut Entrée multiligne arduino
    Bonjour j'ai un code qui fonctionne parfaitement avec mon lien logiciel qui envoie 2 valeurs en même temps à arduino pour faire une Wavforme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     #include "Nextion.h"
     NexWaveform s0 = NexWaveform(0, 21, "s0");
     
     
       }

  2. #2
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 895
    Par défaut
    Un buffer de 1000 octet c'est énorme sur un petit arduino..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buffer[1000] = {0};
    => Quelle est la taille habituelle du message reçu? allouez ce qui est nécessaire pas plus

    il vaut mieux éviter Serial.readStringUntil() qui inclut un timeout.

    Si vous voulez faire quelque chose de solide, écrivez une fonction asynchrone qui écoute le port série et quand vous avez reçu un message complet, analysez le.
    Si vous voulez faire quelque chose de très solide et optimisé en gestion de la mémoire, il faut sans doute éviter la classe String - mais dans un premier temps c'est OK.

    pour écrire la fonction d'écoute, il faut savoir quel est le marqueur de fin de message. qu'envoyez vous réellement? est-ce un truc du genre "(12,32,44)" ou "(A; 12,33)" --> la marque de fin de message semble être la parenthèse fermante (et celui de début de message serait une parenthèse ouvrante)

    un code comma cela vous donne une idée de l'approche:
    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
    const byte tailleMax = 20;
    const char marqueurDeDebut = '(';
    const char marqueurDeFin = ')';
    String message;
     
    bool getMessage()
    {
      if (Serial.available()) {
        char caractereRecu = Serial.read();
        switch (caractereRecu) {
          case marqueurDeDebut: message = marqueurDeDebut; break;
          case marqueurDeFin: message += marqueurDeFin; return true; break;
          case ' ': break; // on ignore les espaces (par exemple)
          default: message += (char) toupper(caractereRecu); // on conserve tout en majuscules
        }
        // éventuellement si la chaîne devient trop longue c'est qu'il y a un souci, on coupe
        if (message.length() > tailleMax) message = "";
      }
      return false;
    }
     
    void setup() {
      Serial.begin(115200);
      message.reserve(tailleMax);
    }
    void loop()
    {
      if (getMessage()) {
        Serial.print(F("Message reçu : ")); Serial.println(message);
        message = ""; // on vide le message une fois traité
      }
    }
    par exemple si vous tapez dans la console ouverte à 115200 bauds
    hflka zjhaflehaf laz(A,12,33)ajkhkzfhkd
    le code va juste extraire (A,12,33) et vous devriez voir
    Message reçu : (A,12,33)
    dans la console série.

    Ensuite à vous de jouer pour extraire avec les méthodes de la classe String les éléments qui vous intéressent

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2021
    Messages : 3
    Par défaut Bonjour merci de votre réponse
    j'écrite de mon logiciel pour controlé un slider text ou button la variable (A B C ou D) suivie de ; ensuite j'écrit la valeur text ou chiffre envoyer a arduino qui transmet a mon écran

    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
    NexWaveform s0 = NexWaveform(0, 21, "s0");
    NexDSButton bt0 = NexDSButton(0, 18, "bt0");
    NexSlider h0 =  NexSlider(0,3,"h0");
    NexSlider h1 =  NexSlider(0,4,"h1");
    NexText t0 =  NexText(0,1,"t0");
     
     
     
     
    side.toInt();
     
     
        }
      }
     
    }

  4. #4
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 895
    Par défaut
    votre souci c'est que vous ne lisez pas l'entrée jusqu'au marqueur de fin (la parenthèse fermante) mais jusqu'à un ';' pour essayer de lire une commande. Le challenge c'est que (E ; 277 E ; 128) comprend 2 lectures pour faire une seule commande. Votre approche ne fonctionne pas.

    ==> ce serait bcp plus simple d'analyser une commande entière si vous attendez d'avoir reçu tout ce qui se trouve entre parenthèses. c'était ma suggestion

    de plus si une commande de type 'E' prend deux paramètres, pourquoi ne pas l'envoyer sous la forme (E ; 123 255) par exemple? à quoi ça sert de répéter le E ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2021
    Messages : 3
    Par défaut avec mon code sa marche
    quand j'envois E ; 123 255 je reçois E 123 255

  6. #6
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 895
    Par défaut
    ben... oui - le code ne demande pas de lire la seconde valeur...

    pourquoi ne prenez vous pas l'approche proposée avec les parenthèses pour lire la commande complète?

Discussions similaires

  1. Réponses: 10
    Dernier message: 27/03/2018, 21h07
  2. Connexion Arduino & Raspberry en USB avec Serial
    Par Alexis55000 dans le forum Raspberry Pi
    Réponses: 20
    Dernier message: 22/12/2016, 23h00
  3. programmer arduino avec simulink
    Par youssefhoky dans le forum Simulink
    Réponses: 0
    Dernier message: 01/04/2015, 20h38
  4. programmer plusieurs PIn d'entrées sur labview avec arduino
    Par chakibcubee dans le forum LabVIEW
    Réponses: 0
    Dernier message: 24/02/2015, 17h33
  5. Communication arduino avec VB.net
    Par chrifi dans le forum Arduino
    Réponses: 1
    Dernier message: 24/05/2013, 13h49

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