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 :

Reception de bytes par Arduino via Serial?


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Par défaut Reception de bytes par Arduino via Serial?
    Bonjour a tous,

    Voici mon problème, j'aurais besoin d'aide car je voudrais stocker trois bytes qui contiennent chacune des valeurs de 0-255 dans trois variables différentes (Rouge, Vert, Bleu) est ensuite les placer exemple dans analogWrite(RougePin, Rouge);

    Voici le code qui me permet de de lire les bytes et de l'es afficher dans serial monitor. Mon problème est que je ne sais pas comment faire le code pour lire les trois bytes et les stocker dans des variables

    Merci de votre aide

    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
    #include <SoftwareSerial.h>
     
    SoftwareSerial gtSerial(8, 7); // Arduino RX, Arduino TX
    int RougePin = 9;
    int VertPin = 10;
     
    byte rxbyte = 0;
    void setup() {
      Serial.begin(9600);    // serial / USB port / software serial port
      Serial.flush();
      pinMode(RougePin, OUTPUT);
    }
     
    //byte rxbyte = 0;        // stores received byte
     
     
    void loop() {
      // check if byte available from USB port
      if (Serial.available() > 0) {
         rxbyte = Serial.read();
     
         Serial.print(" Data:");
         Serial.println(rxbyte);
     
     
      }
     }

  2. #2
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir Chrisgrenier

    Je pense que le mieux est de les recevoir en tant que chaîne de caractères et ensuite les transformer en numérique avec chaîne_de_caractères.toInt()
    Pour adresser les LED tout en variant leur intensité, tu pourrais transmettre quelque chose comme 2075 qui veut dire LED 2 à 75 d'intensité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String chaine_de_caracteres = "2075";
    int valeurRecue = chaine_de_caracteres.toInt();
    int Nunmero_de_la_LED = valeurRecue/1000;
    int intensite_de_la_LED = valeurRecue%1000;
    Je peux te faire un exemple complet, si tu le désires.

    Cordialement
    jpbbricole

  3. #3
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Par défaut
    Bonsoir jpbbricole,

    Le logiciel qui envoie les données sont transmises en bytes et non en chaîne de caractères "string".

    Donc je ne pence pas que cela pourrais fonctionner?

    Merci

    Chris

  4. #4
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir Chrisgrenier

    C'est quoi ce logiciel, comment différencie-t-il la LED à régler?

    Cordialement
    jpbbricole

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Dans ce cas il y a la fonction Serial.readBytes() ou readBytesUntil()...

    Comment sont envoyées les données ? Les trois bytes l'un directement après l'autre ?

  6. #6
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    C'est quoi comme logiciel?
    Comment on sait le début et surtout la fin de la transmission?

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Oui effectivement il faut connaitre le protocole utilisé par le logiciel pour transmettre les données...

  8. #8
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    @JPbricole a raison d’insister avec sa question...

    Lire c’est simple si vous savez que vous avez toujours trois octets transmis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void loop()
    {
      byte a,b,c;
      if (Serial.available() >= 3) {
        a = Serial.read();
        b = Serial.read();
        c = Serial.read();
        traitement(a, b, c);
      }
    }
    Le souci fondamental cependant c’est que si Ce que vous recevez est un flux de données, vous n’avez aucune idée pour savoir si a c’est rouge vert ou bleu (si vous avez pris la communication en cours de transmission).

    Quand on émet en ascii, il y a de nombreuses de valeurs qui ne représentent pas des symboles de l’alphabet ou des chiffres et on peut s’en servir comme séparateur (marqueur de fin de t4ansmission). Par exemple si vous savez que après les valeurs rouge vert bleu il y a un passage à la ligne, Vous pouvez attendre ce passage à la ligne Pour vous synchroniser.

    Le souci lorsqu’on émet en binaire C’est que le code du retour à la ligne (‘\r’ ou ‘\n’) est aussi une valeur admissible de vos couleurs puisque toutes les valeurs entre 0 et 255 sont possibles.

    C’est pour cela qu’il faut connaître le protocole.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Par défaut
    les données sont envoyer en trois bytes l'un directement après l'autre avec un stopBits.

    Quand j'utilise le code Arduino (voir code) je vois très bien les trois bytes dans le SerialMonitor exemple si je deplace le trackBar Rouge a 88, trackBar Vert a 30 et trackBar Bleu a 99 et bien les valeurs sont afficher sur le serial monitor (voir lìmage)

    Nom : SerialMonitor.png
Affichages : 127
Taille : 2,1 Ko

    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
    #include <SoftwareSerial.h>
     
    SoftwareSerial gtSerial(8, 7); // Arduino RX, Arduino TX
    int RougePin = 9;
    int VertPin = 10;
     
    byte rxbyte = 0;
    void setup() {
      Serial.begin(9600);    // serial / USB port / software serial port
      Serial.flush();
      pinMode(RougePin, OUTPUT);
    }
     
    //byte rxbyte = 0;        // stores received byte
     
     
    void loop() {
      // check if byte available from USB port
      if (Serial.available() > 0) {
         rxbyte = Serial.read();
     
         Serial.print(" Data:");
         Serial.println(rxbyte);
     
     
      }
     }

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par Chrisgrenier Voir le message
    les données sont envoyer en trois bytes l'un directement après l'autre avec un stopBits.

    Quand j'utilise le code Arduino (voir code) je vois très bien les trois bytes dans le SerialMonitor exemple si je deplace le trackBar Rouge a 88, trackBar Vert a 30 et trackBar Bleu a 99 et bien les valeurs sont afficher sur le serial monitor (voir lìmage)
    Ok mais le problème c'est qu'il y a plusieurs interprétations possibles...

    Une fois que les couleurs on été modifiées est-ce que le logiciel envoi trois bytes ou bien il faut par exemple cliquer sur un bouton (envoi) ?

    Qu'est-ce qui se passe si seule une couleur est changée ? Est-ce que le logiciel envoi un seul byte correspondant à la couleur qui a changé ou bien il envoi toujours trois bytes dans le même ordre ?


    PS : Jay M a posté un code permettant de lire les trois bytes...

  11. #11
    Membre à l'essai
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Octobre 2016
    Messages : 5
    Par défaut
    Il n'y a aucun bouton (envoi) les trois bytes sont en voyer instantanément quant du déplace une des trois trackbar seulement, donc exemple ci les valeurs a la dernière lecteur étaient a Rouge: 88, Vert:30 et Bleu:99 et que je déplace la trackbar bleu a 255 alors les lecteurs vont être Rouge: 88, Vert:30 et Bleu:255. Donc le logiciel envoi toujours trois bytes dans le même ordre mais seulement la bytes qui correspond a la couleur et mis a jours

    P.S Je vais demander a Jay M de me poster un code complet car j'ai essayer avec sont code est j'ai des erreurs de compilation...

    Merci

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Oui maintenant avec ces précisions c'est plus clair, il n'y a donc rien qui indique le début et/ou la fin de transmission mais vu que c'est un être humain qui change les valeurs on peut supposer qu'entre deux envois il y a un temps suffisamment long pour permettre de bien distinguer les différents envois les uns des autres...

    Citation Envoyé par Chrisgrenier Voir le message

    P.S Je vais demander a Jay M de me poster un code complet car j'ai essayer avec sont code est j'ai des erreurs de compilation...
    Oui c'est normal, c'est un code pour te montrer comment faire, c'est à toi par exemple d'ajouter la fonction "traitement"...

  13. #13
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Bonjour
    vu que c'est un être humain qui change les valeurs on peut supposer qu'entre deux envois il y a un temps suffisamment long pour permettre de bien distinguer les différents envois les uns des autres...
    ca ce n’est pas si sûr car il nous parle de slider donc un humain peut quand même le bouger assez vite et si le code est fait pour envoyer les modifications à chaque valeur intermédiaire en passant de Red=0 à Red=50 vous aurez eu un flot de 50x3 octets envoyés. Tant que le récepteur est démarré et connecté avant de recevoir le moindre octet et qu’il n’y a pas de perte sur la ligne (attention avec software serial ...) alors ça devrait aller mais ce n’est généralement pas une bonne idée de ne pas permettre de savoir se synchroniser avec l’émetteur.

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Oui c'est vrai que ce serait préférable qu'il y ait un certain protocole...
    Peut-être qu'il y a moyen de configurer le logiciel ? A Chrisgrenier de voir...

  15. #15
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir à tous
    Citation Envoyé par Beginner. Voir le message
    Salut,

    Oui c'est vrai que ce serait préférable qu'il y ait un certain protocole...
    Comme les 3 bytes sont envoyés instantanément:
    si l'on n'a pas reçu de byte pendant un temps égal à 2 ou 3 fois le temps d'un byte à 9600 (Serial.begin(9600);) et que Serial.available() != 0, faire un Serial.flush();

    Cordialement
    jpbbricole

  16. #16
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Oui bonne idée ! Cela correspond à ce que je pensais : il doit bien se passer un certain temps entre deux envois de trois bytes qui permet de distinguer les différents envois les uns des autres...

  17. #17
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Bonsoir
    Citation Envoyé par jpbbricole Voir le message
    Comme les 3 bytes sont envoyés instantanément, si l'on n'a pas reçu de byte pendant un temps égal à 2 ou 3 fois le temps d'un byte à 9600 et Serial.available() != 0,
    oui ce serait un moyen de se synchroniser

    faire un Serial.flush();
    euh ça ça ne sert à rien. Flush attend juste que le buffer en emission soit vide. Là ce qui compte c’est ce qu’on reçoit


    Il faudra quand même vérifier le comportement exact du slider - il peut balancer très rapidement des octets et ça va arriver en flux.

    Le récepteur peut aussi se dire que ce qui compte ce sont les 3 derniers octets reçus avant une pause

Discussions similaires

  1. Communication entre Arduino et Matlab via serial
    Par Matwix dans le forum Arduino
    Réponses: 4
    Dernier message: 04/12/2017, 14h48
  2. Reception de données par le port parallèle
    Par dungot91 dans le forum VB 6 et antérieur
    Réponses: 68
    Dernier message: 11/08/2006, 19h29
  3. Envoie d'un fichier excel par mail via un bouton d'action
    Par ghostal dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/07/2006, 08h22
  4. [VB6]Lancer de multiples prog un par un via la cde shell
    Par jpg dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 20/12/2005, 14h17
  5. [Système] Connexion ssh par exec via le web
    Par naourass dans le forum Langage
    Réponses: 9
    Dernier message: 01/12/2005, 12h08

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