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 !