Suite à mes précédents posts (cf. le dernier en date), je me lance dans une ultime tentative d'obtenir ce que je souhaite.
Le contexte : je tente de lire un signal radar à 4 kHz avec une carte Arduino Uno équipée d'un shield Ethernet, puis d'envoyer le tout à un RPi via Ethernet/UDP, avec du Python côté RPi et évidemment du C côté Arduino. L'idée est de lire et de stocker des valeurs avec l'Arduino, puis de balancer le tout régulièrement au RPi avec un câble RJ45.
J'essaie dans un premier temps de communiquer de manière basique entre mes cartes, mais j'ai un souci de réception des données sur le RPi : 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 pour référence :
Code : Tout sélectionner
#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);
}
Code : Tout sélectionner
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
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 pensais que le problème venait 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 quelque part (c'est ce que ça m'évoque ; en toute honnêteté, je n'en sais rien).
Finalement, j'arrive à faire communiquer deux cartes Arduino avec le même code, donc c'est probablement plus côté Python que ça déconne, et c'est la fonction recvfrom() qui a l'air de poser problème (erreur timeout: timed out).
Auriez-vous une idée de ce qui ne va pas ?
Merci d'avance pour vos remarques !
PS : petit aparté ; ça vous paraît faisable ce que je tente ?