Communication UDP/Ethernet entre Uno et RPi

Bonjour,

Dans le cadre d'un projet, je souhaite envoyer à un Raspberry Pi via UDP des mesures faites depuis une Arduino Uno équipée d'un shield Ethernet.

En me basant sur ce tuto que j'ai adapté pour avancer pas à pas, j'arrive à faire communiquer mes deux cartes pendant quelques secondes, puis tout s'arrête, jusqu'à ce que je reset mon Arduino, auquel cas le même problème survient de nouveau au bout de quelques secondes.

Voici mon code Arduino :

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

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(169, 254, 43, 243);
unsigned int localPort = 5000;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
String datReq;
int packetSize;
EthernetUDP Udp;

void setup()
{

  Serial.begin(230400);
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);
  delay(1500);

}

void loop()
{
  
  packetSize = Udp.parsePacket();

  if (packetSize > 0)
  {

    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    
    String datReq(packetBuffer);

    if (datReq == "red")
    {

      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
      Udp.print("RED");
      Udp.endPacket();

      return;
      
    }

    else if (datReq == "green")
    {

      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
      Udp.print("GREEN");
      Udp.endPacket();

      return;
      
    }

    else if (datReq == "blue")
    {

      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
      Udp.print("BLUE");
      Udp.endPacket();

      return;
      
    }
    
  }

  memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);

}

Et pour compléter, le code Python côté RPi :

from socket import *
import time

address = ("169.254.43.243", 5000)
client_socket = socket(AF_INET, SOCK_DGRAM)
client_socket.settimeout(0.1)

while (1):

    # --- red ---

    data = "red"
    client_socket.sendto(data, address)

    try:
        
        rec_data, addr = client_socket.recvfrom(2048)
        print(rec_data)

    except:

        print("except red")
        pass

    # --- green ---

    data = "green"
    client_socket.sendto(data, address)

    try:
        
        rec_data, addr = client_socket.recvfrom(2048)
        print(rec_data)

    except:

        print("except green")
        pass

    # --- blue ---

    data = "blue"
    client_socket.sendto(data, address)

    try:
        
        rec_data, addr = client_socket.recvfrom(2048)
        print(rec_data)

    except:

        print("except blue")
        pass

L'ensemble n'est pas trop compliqué à comprendre : le RPi envoie un mot et reçoit en retour la réponse adaptée (en l'occurrence, le même mot mais en majuscules), puis passe au mot suivant, et boucle indéfiniment.

Le code Arduino compile et s'uploade sur la carte sans souci, et le code Python s'exécute sans problème non plus. Je devrais alors avoir dans ma console Python une succession de RED, GREEN, BLUE, RED, GREEN, etc., ce qui est le cas pendant quelques secondes, puis les except se succèdent...

Je pense que le problème vient du code Arduino, car j'ai remarqué que c'est GREEN qui me renvoie les premiers except, puis BLUE, et enfin RED : c'est dans l'ordre décroissant de longueur de caractères que les except liés surviennent, ce qui m'amène à penser qu'il y a une dépassement de mémoire quelques part (c'est ce que ça m'évoque ; en toute honnêteté, je n'en sais rien).

Auriez-vous une idée de ce qui ne va pas ?

Merci d'avance pour vos remarques ! :slight_smile:

bonjour,
tu aurais pas oublié dans le py
time.sleep(2)
car là, tu envoie en continu comme une attaque les data

infobarquee:
tu aurais pas oublié dans le py
time.sleep(2)
car là, tu envoie en continu comme une attaque les data

C'est intentionnel de ma part ! :wink:
Ce sont des données d'accélération que je récupère (avec un MPU6050 sur un circuit GY-521), donc j'ai enlevé les délais pour avoir le plus de valeurs "en temps réel" possible.

J'ai rajouté les délais au cas où, et le problème persiste. Après avoir ajouté côté Python un print(i) à chaque boucle du while, je m'aperçois que c'est toujours au bout de 28 itérations que le problème survient, ce qui me fait encore plus penser que le problème vient d'un buffer quelque part...