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 :

Communication entre deux Mega2560, problème de sauvegarde chaine de caractère


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Apprentissage personnel
    Inscrit en
    Janvier 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Apprentissage personnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2015
    Messages : 25
    Par défaut Communication entre deux Mega2560, problème de sauvegarde chaine de caractère
    Bonjour à toutes et à tous,

    Je débute sur Arduino et mon niveau en C est très poussiéreux.
    Cela fait plusieurs jour que je fait des essais de communication entre deux Arduino Mega2560 via le port I2C.
    Jusque là je me suis débrouillé seul mais maintenant je coince....

    Voilà mon problème :
    L'idée de mes travaux est de communiquer au travers de chaines de caractères.
    L'Arduino Maitre envoie une requête sous forme de message ("Ready ?") à l'esclave -> Ok ça fonctionne.
    L'esclave enregistre le message dans la variable (recudumaitre) -> Ok ça fonctionne.
    L'esclave envoie la requête du Maitre sur sa console -> Ok ça fonctionne.
    L'esclave envoie au Maitre sa réponse ("Yes Ready !") -> Ok ça fonctionne.
    L'esclave envoie la valeur de la variable (recudumaitre) sur sa console -> Ça ne fonctionne pas, il n'y a que le dernier caractère...

    Je n'arrive pas à comprendre si mon problème vient du fait qu'il n'y ai qu'un seul caractère dans ma variable (recudumaitre) à l'instant T, donc si je dois passer par une incrémentation des caractères ?
    Ou si mon problème est d'ordre du format de la variable (recudumaitre) ?

    Quelqu'un aurait-il une solution ou une piste??

    Le code du Maitre :
    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
     
    // Maitre Arduino 2560
    #include <Wire.h>
    const int bp = 2;    // Entrée bp
     
    void setup()
    {
    Wire.begin();       // Init I2C maître
    Serial.begin(9600);  // Init Serie
    pinMode(bp, INPUT);  // Bouton poussoir envoie de msg à l'esclave
    }
     
    void loop()
    {
    int etatbp; 
    etatbp = digitalRead(bp);
    if(etatbp == HIGH)
    {EnvoieRecoit();}
    }
     
    void EnvoieRecoit()
    { 
    Wire.beginTransmission(0x01); // Ouvre la comm avec esclave 0x01
    Wire.write("Ready ?");          // Charge la valeur à envoyer
    Wire.endTransmission();       // envoie et ferme la comm avec esclave 0X01
    delay(1000);
    Wire.requestFrom(0x01, 11);    // recoit le retour de l'esclave, 11 bytes
    while(Wire.available())
      {char retour = Wire.read();
       Serial.print(retour);}
    Serial.println();
    }
    Le code de l'Esclave :
    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
     
    // Esclave Arduino 2560
    #include <Wire.h>
    int rep = 0;
    char recudumaitre = "";
     
    void setup()
    { Wire.begin(0x01); 
      Wire.onReceive(reception);      // fonction de lecture appellée quand un msg du Maitre est arrivé
      Serial.begin(9600);
      Wire.onRequest(requestEvent);   // fonction d'écriture appellée en réponse d'une demande du Maitre
    }  
     
    void loop()
    {delay(100);}
     
    void reception(int NbByte)
    { while(Wire.available() > 0)
        {recudumaitre = Wire.read();  // Enregistrement du message du Maitre dans la variable recudumaitre
         Serial.print(recudumaitre);} // Envoie du message du Maitre dans la console
     
      Serial.print(" : ");
      Serial.print(NbByte);
      Serial.print(" byte(s)");
    }
     
    void requestEvent()
    {
      Wire.write("Yes Ready !"); // Répondre avec un message de 11 octets (bytes)
      Serial.print(" : recudumaitre = "); // Envoie dans la console de la valeur stockée dans la variable recudumaitre
      Serial.println(recudumaitre);
    }

    Console du Maitre :
    Yes Ready ?

    Console de l'Esclave :
    Ready ? : 7 byte(s) : recudumaitre = ?

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    bonjour;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char recudumaitre = "";
    tu as déclaré 1 caractère.
    D'ailleurs la documentation dit bien
    Reads a byte
    . Il te faut boucler sur cette fonction pour lire tous les caractères. Donc pour ton esclave :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    char recudumaitre[12];
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i=0;
    while(Wire.available() > 0)
    {
         recudumaitre[i] = Wire.read();  // Enregistrement du message du Maitre dans la variable recudumaitre
         Serial.print(recudumaitre[i]);
         i++;
    } // Envoie du message du Maitre dans la console

  3. #3
    Membre averti
    Homme Profil pro
    Apprentissage personnel
    Inscrit en
    Janvier 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Apprentissage personnel
    Secteur : Bâtiment

    Informations forums :
    Inscription : Janvier 2015
    Messages : 25
    Par défaut
    Un grand Merci Auteur,

    C'est parfait, ça fonctionne et j'ai bien compris.

    Question résolue

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problèmes de communication entre deux routeurs
    Par doyoo78 dans le forum Équipements
    Réponses: 7
    Dernier message: 10/10/2013, 17h23
  2. Problème de communication entre deux fonctions
    Par AyManoVic dans le forum Langage
    Réponses: 0
    Dernier message: 24/10/2011, 15h47
  3. Réponses: 1
    Dernier message: 27/06/2011, 18h27
  4. Réponses: 4
    Dernier message: 19/11/2010, 16h42
  5. [RMI] Problème de communication entre deux machines distantes
    Par georges_jung dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 10/04/2007, 18h03

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