Non riesco a far funzionare correttamente una connessione ethernet. Dove devo fare?
Quello che deve fare il programma è la seguente procedura: controllo se dalla ethernet mi è arrivato qualche dato, se si processo la risposta e rispondo. Io ho fatto così:
se non chiudi la connessione al clinet, allora arrivi al limite di 4 connessioni contemporanee.
Sarebbe carino che creassi un sketch che testi SOLOla etenet, per capire se il problema è nella libreria o nel tuo codice, un esempio come quello che hai poststao ma funzionante
Fatto, ma ancora non va. Per un po va (e più di 4 cicli) e poi smette di rispondere. Inoltre se aumento la frequenza delle richieste diminuisce anche il numero di volte (non il tempo) dopo il quale smette di funzionare...
ok, ci siamo. Assicurati di avere l'ultima versione di IDE (1.0.4) che risolve un BUG con la malloc(), e poi metti una serie di scritte seriali per capire dove si blocca il codice
Per i posteri, ho risolto. Io problema era come utilizzavo la Ethernet. Mi spiego meglio: io facevo una cosa così strutturata:
void loop() {
EthernetClient client = server.available()
if (!client) {
client.stop();
return;
}
else {
while (client.available()) {
//leggo i dati
}
//elaboro i dati
client.write(//dati da rispedire);
}
}
Il problema di fondo è che questa cosa va bene se alla fine della comunicazione il client chiude la connessione, tipo un browser html, ma non nel mio caso, quindi ho fatto così:
EthernetClient client;
boolean alreadyConnect;
boolean datoRicevuto;
void loop() {
if (!alreadyConnect) {
client = server.available()
if (!client) {
datoRicevuto = false;
client.stop();
return;
}
else {
alreadyConnect = true;
}
if (alreadyConnect) {
if (!datoRicevuto) {
while (client.available()) {
//leggo i dati
}
//Verifico di aver ricevuto tutto il dato
//nel mio caso la lunghezza del dato è contenuta nel dato stesso
if (//condizione sul dato ricevuto) datoRicevuto = true;
}
if (datoRicevuto) {
//Elaboro i dati
client.write(//dati da spedire);
datoRicevuto = false;
}
if (!client.connected()) {
client.stop();
alreadyConnect = false;
}
}
}
In pratica devo controllare se ho già una connessione aperta, nel qual caso di non riaprirla.