communication de 2 arduino en udp?

Bonjour,
Voila,
Le montage:
1 Uno avec shield w5100
1 mega avec shield w5100
2 bretelle droite
1 micro switch 5 entrée

je voudrai faire communiquer les 2 cartes en udp. Pour cela, j'ai cherché des exemples (dont celui de la library), mais je ne parviens pas à les faire fonctionner. J'ai donc essayé de faire quelque chose mais sans succès non plus.

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <SD.h>
#include <Ethernet.h>
#include <EthernetUdp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008

//Ethernet
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xDD};                  // L'adresse MAC du shield
IPAddress ip(192, 168, 1, 178);                                     // L'adresse IP que prendra le shield
IPAddress my_dns( 192, 168, 1, 254 );
IPAddress gateway( 192, 168, 1, 254 );
IPAddress subnet( 255, 255, 255, 0 );

EthernetServer serverEthernet(80);                                  // Initialise notre serveur il écoutera sur le port 4200

byte sd;                                                            // Retour d'erreur SD 0= pas de carte 1=carte ok 9=carte pleine

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;                                                    // Nom du serveur UDP
unsigned int localPort = 8888;                                      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];                          // buffer to hold incoming packet,
char  ReplyBuffer[] = "acknowledged";                               // a string to send back

//-----------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  SD.begin(4);
  
  Serial.println("...");
  
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  sd = 1;
  char erreur = 0;
  erreur = Ethernet.begin(mac);                                     // On démarre le shield Ethernet SANS adresse ip (donc donnée via DHCP)

  if (erreur == 0)                                                  // si une erreur a eu lieu cela signifie que l'attribution DHCP n'est pas active
  {
    Serial.println("Parametrage avec ip fixe...");
    Serial.print("adresse server: ");
    Serial.println(ip);
    Ethernet.begin(mac, ip, my_dns, gateway, subnet);
  }
  else
  {
    Serial.println("Parametrage avec ip dynamique...");
    Serial.print("adresse server: ");
    Serial.println(Ethernet.localIP());
  }
  serverEthernet.begin();
  delay (2000);
  Serial.println("Pret!");
}

//-----------------------------------------------------------------
void loop() {
  
  //si des données sont disponibles, lire le paquet
  int packetSize = Udp.parsePacket();
  //Serial.print ("packetSize= "); Serial.println(packetSize);
  if(packetSize)
  {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i =0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    //lit les données dans le tableau de réception
    Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    // envoie une réponse au port et adresse qui l'a envoyé
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
  delay(10);
}
#include <SPI.h>         // needed for Arduino versions later than 0018
#include <SD.h>
#include <Ethernet.h>
#include <EthernetUdp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008

//Ethernet
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE};                  // L'adresse MAC du shield
IPAddress ip(192, 168, 1, 177);                                     // L'adresse IP que prendra le shield
IPAddress my_dns( 192, 168, 1, 254 );
IPAddress gateway( 192, 168, 1, 254 );
IPAddress subnet( 255, 255, 255, 0 );

EthernetServer serverEthernet(80);                                  // Initialise notre serveur il écoutera sur le port 4200

byte sd;                                                            // Retour d'erreur SD 0= pas de carte 1=carte ok 9=carte pleine

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;                                                    // Nom du serveur UDP
unsigned int localPort = 8888;                                      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];                          // buffer to hold incoming packet,
char  ReplyBuffer[] = "acknowledged";                               // a string to send back

char IP [40];
char MESSAGE [40];
int i;

boolean attente = false;
boolean ipFl      = false;
boolean messageFl = false;

//-----------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  SD.begin(4);

  Serial.println("...");

  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  sd = 1;
  char erreur = 0;
  erreur = Ethernet.begin(mac);                                     // On démarre le shield Ethernet SANS adresse ip (donc donnée via DHCP)

  if (erreur == 0)                                                  // si une erreur a eu lieu cela signifie que l'attribution DHCP n'est pas active
  {
    Serial.println("Parametrage avec ip fixe...");
    Serial.print("adresse server: ");
    Serial.println(ip);
    Ethernet.begin(mac, ip, my_dns, gateway, subnet);
  }
  else
  {
    Serial.println("Parametrage avec ip dynamique...");
    Serial.print("adresse server: ");
    Serial.println(Ethernet.localIP());
  }
  serverEthernet.begin();
  delay (2000);
  Serial.println("Pret!");
}

//-----------------------------------------------------------------
void loop() {

  Send();

if (ipFl && messageFl)
{
  Serial.print("Transfert message à ");
  Serial.println( IP);
  
    // envoie une réponse au port et adresse qui l'a envoyé
    Udp.beginPacket(IP, localPort);
    Udp.write(MESSAGE, i);
    Udp.endPacket();
    
    ipFl      = false;
    messageFl = false;
}

  

}

void Send()
{
  i = 0;
  if (!attente)
  {
    Serial.println("Entrer IP");
    attente = true;
  }

  while (attente)
  {
    if (Serial.available())
    {
      delay(50);
      while (Serial.available())
      {
        IP[i] = Serial.read();
        i++;
        IP[i] = '\0';
        attente = false;
      }
    Serial.println(IP);
    ipFl = true;
    }
  }

  //-----------------------------
  i = 0;
  if (!attente)
  {
    Serial.println("Entrer Message");
    attente = true;
  }

  while (attente)
  {
    if (Serial.available())
    {
      delay(50);
      while (Serial.available())
      {
        MESSAGE[i] = Serial.read();
        i++;
        MESSAGE[i] = '\0';
        attente = false;
      }
    Serial.println(MESSAGE);
    messageFl = true;
    }
  }
}

Merci pour votre aide!

Personne n'à d'idée?

Déjà, ta fonction Send() me parait foireuse. Tu peux sortir de la première boucle sans être assuré d'avoir une adresse IP complète. Pourquoi n'avoir pas attendu de recevoir un CR pour commencer la saisie du message?
Ensuite l'adresse IP est sous forme d'une chaîne de caractères as-tu vérifié que c'est bien sous cette forme que l'adresse IP doit être passée à beginPacket(). La doc semble te contredire

En fait, comme tu fonctionnes en IP fixe et pour commencer, pourquoi ne pas mettre l'aresse IP et le message en dur dans le programme?

Bonsoir,
Je remonte le sujet car ces derniers temps, je nai pas eu le temps de m'en occuper. Je viens de me replonger dessus et j'ai suivi les recommandation de fdufnews. J'ai simplifié les codes.

Eméteur:

#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

//Ethernet
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE};                  // L'adresse MAC du shield
IPAddress ip(192, 168, 1, 177);                                     // L'adresse IP que prendra le shield
IPAddress my_dns( 192, 168, 1, 254 );
IPAddress gateway( 192, 168, 1, 254 );
IPAddress subnet( 255, 255, 255, 0 );

EthernetServer serverEthernet(80);                                  // Initialise notre serveur il écoutera sur le port 80

byte sd;                                                            // Retour d'erreur SD 0= pas de carte 1=carte ok 9=carte pleine

// Instance EthernetUDP pour nous envoyer et recevoir des paquets
EthernetUDP Udp;                                                    // Nom du serveur UDP
unsigned int localPort = 8888;                                      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];                          // buffer to hold incoming packet,
char  ReplyBuffer[] = "01020304\tABC\t";                               // a string to send back

char c [40];
char d [40];
int compteur = 0;
boolean attente = false;

//-----------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  SD.begin(4);

  Serial.println("...");
  // start the Ethernet and UDP:
  //Ethernet.begin(mac, ip);
  Ethernet.begin(mac, ip, my_dns, gateway, subnet);
  Udp.begin(localPort);
  Serial.println("Pret!");
}

//-----------------------------------------------------------------
void loop() {
  // envoie une réponse au port et adresse qui l'a envoyé

  byte adr[] = {0xC0, 0xA8, 0x1, 0xB2}; //192.168.1.177
  unsigned int port = 8888;
  Udp.beginPacket(adr , port);
  Udp.write(ReplyBuffer);
  Udp.endPacket();
  Serial.println(ReplyBuffer);
  delay(1000);

}
//-----------------------------------------------------------------

Récepteur:

#include <SPI.h>
#include <SD.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

//Ethernet
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEB};                  // L'adresse MAC du shield
IPAddress ip(192, 168, 1, 178);                                     // L'adresse IP que prendra le shield
IPAddress my_dns( 192, 168, 1, 254 );
IPAddress gateway( 192, 168, 1, 254 );
IPAddress subnet( 255, 255, 255, 0 );

EthernetServer serverEthernet(80);                                  // Initialise notre serveur il écoutera sur le port 80

byte sd;                                                            // Retour d'erreur SD 0= pas de carte 1=carte ok 9=carte pleine

// Instance EthernetUDP pour nous envoyer et recevoir des paquets
EthernetUDP Udp;                                                    // Nom du serveur UDP
unsigned int localPort = 8888;                                      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];                          // buffer to hold incoming packet,
char  ReplyBuffer[] = "acknowledged";                               // a string to send back

//-----------------------------------------------------------------
void setup()
{
  Serial.begin(9600);
  SD.begin(4);

  Serial.println("...");
  // start the Ethernet and UDP:
  //Ethernet.begin(mac, ip);

  Ethernet.begin(mac, ip, my_dns, gateway, subnet);
  Udp.begin(localPort);
  Serial.println("Pret!");
}

//-----------------------------------------------------------------
void loop()
{
  //si des données sont disponibles, lire le paquet
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    //lit les données dans le tableau de réception
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    Serial.println("Contents:");
    Serial.println(packetBuffer);

  }
  delay(10);
}
//-----------------------------------------------------------------

Maintenant, il semble y avoir un dialogue, mais c'est aléatoire. Il peu démarrer après 2, 5, x tentative, puis une fois établi, les messages passent bien. Parfois la connexion ne démarre pas.

Bonjour,
Je ne suis pas trés présent ses derniers temps, mais je cherche toujours mon problème UDP.
Quelqu'un sait dans quel format est exprimé l' ip dans "Udp.remoteIP()" ou dans "Udp.beginPacket(ip , port);"

Je ne trouve pas le format. J'ai utilisé "byte adr[] = {0xC0, 0xA8, 0x1, 0xB1}" mais je ne parviens pas à établir le lien.
Merci de votre aide.