Ethernet Shield mi blocca tutto !

leo72:
Ah. Ok.
Ma lo "risolve" oppure no? Dai commenti che si continuano a leggere non parrebbe XD

Risolve il problema che, altrimenti, non si possono usare più "devices" che usano SPI ... ma non credo c'entri nulla con il problema del blocco del funzionamento di cui si stà parlando ... :wink:

Guglielmo

P.S. : Problema di blocco (dopo X tempo) che io ho riscontrato anche con lo shield WiFi originale :frowning:

Problema ripresentatosi stamattina.

Riavviato ieri, per un po' ha funzionato...
Stamattina non funziona piu'

Il browser dice "il server non risponde"
Pero' risponde al ping...

Purtroppo ieri non ho fatto la modifica allo sketch, quindi non posso lanciare un ethernet begin...

acik:
Il browser dice "il server non risponde"
Pero' risponde al ping...

Risponde al ping perché è il W5100 che lo fa in totale autonomia, ovvero non ha bisogno di dialogare con Arduino per farlo, non risponde come server perché il problema è nel software (libreria) che gira su Arduino.
Se ancora non l'avete capito il bug è la libreria stessa e non il W5100 che è utilizzato su molti device hardware, non Arduino, e funziona benissimo senza mai bloccarsi.

Ed in cosa sarebbe buggata la liberia?

Janos:
Ed in cosa sarebbe buggata la liberia?

Se non lo sanno quelli dell'Arduino team non lo so di certo io visto che la eth shield non la uso :slight_smile: , in compenso ho un paio di interfacce ethernet, basate sul W5100 + PIC32, per uso generico con schede/microprocessori non dotati di ethernet che funzionano benissimo senza mai bloccarsi anche dopo molti giorni di funzionamento continuo con carico di lavoro gravoso.

astrobeed:
...
non risponde come server perché il problema è nel software (libreria) che gira su Arduino.
Se ancora non l'avete capito il bug è la libreria stessa e non il W5100 che è utilizzato su molti device hardware, non Arduino, e funziona benissimo senza mai bloccarsi.

Si, si astro, tanto è vero che, come ho segnalato, ho un problema simile anche con la WiFi che usa un altro chip ...

C'è una lunga discussione sul blocco della WiFi qui : Official Arduino WiFi Shield - Issues - Improvements - Call to action - Networking, Protocols, and Devices - Arduino Forum e sembrava che avessero risolto il buco, ma ... ho provato ad aggiornare il FW ed il problema sembra comunque ripresentarsi :frowning:

Guglielmo

allora, se guardate sul git ci sono state un sacco di migliorie alle librerie. per la ethernet consiglio di usare l'ultima versione di IDE (1.0.5 credo), per la WiFi mi pare che sia ancora solo nel git almeno un baco risolto.

lesto:
... per la WiFi mi pare che sia ancora solo nel git almeno un baco risolto.

Si, si, lesto, parlo della versione presa da github ... purtroppo, con tempistiche e motivazioni che non si riescono bene a determinare, ogni tanto si blocca ugualmente ... :frowning:

Guglielmo

urca, riesci a wiresharcare il traffico e vedere cosa succede? magari tenendo anche d'occchio la RAM disponibile?

lesto:
allora, se guardate sul git ci sono state un sacco di migliorie alle librerie. per la ethernet consiglio di usare l'ultima versione di IDE (1.0.5 credo), per la WiFi mi pare che sia ancora solo nel git almeno un baco risolto.

Ci sono un sacco di migliorie in programma... :wink:

Se vai a vedere la cartella della libreria Ethernet, l'ultima modifica è di due mesi fa... Quello che hai letto te probabilmente è il TODO.txt...

no, io seguo gli issue, quindi magari son pull-request che non sono state ancora accettate/respinte.
occhio che molte modifiche non sono fatte sul branch principale ma su rami secondari (esempio: ide-1.5.x-pull115) che poi vengono mergiati.

lesto:
urca, riesci a wiresharcare il traffico e vedere cosa succede? magari tenendo anche d'occchio la RAM disponibile?

Posso provarci ...
... però attenzione, come per la ethernet, anche per la WiFi, credo che l'HW continui a funzionare regolarmente, solo che da SW, non si ricevono più le connessioni (... problema della libreria). Il codice però continua a girare e il memoryFree riporta ancora alcune centinaia di byte di RAM libera (sull'UNO).

Ora sto facendo una prova inserendo nel loop, ogni N secondi, uno statement che, di per se è messo nel punto sbagliato e con la logica sbagliata (... è una server.write('0') senza alcuna connessione attiva), ma che mi ha dato l'idea eviti il blocco (... data la casualità del problema, non sei mai sicuro se l'hai risolto o meno).

Guglielmo

lesto:
no, io seguo gli issue, quindi magari son pull-request che non sono state ancora accettate/respinte.
occhio che molte modifiche non sono fatte sul branch principale ma su rami secondari (esempio: ide-1.5.x-pull115) che poi vengono mergiati.

Però allora è inutile scaricare, almeno per il momento, la 1.0.5 da git... :wink:

Non ci sono molte modifiche
--> Arduino/revisions.txt at master · arduino/Arduino · GitHub

non guardare i revision .txt che sono solo il sunto del riassunto, e fatto a mano, cioè fallibile... molto meglio guardare l'elnco di tutte le modifiche effettuate :slight_smile:

notare il 28 un "Merge branch 'wifishield-bugfix'"

... però attenzione, come per la ethernet, anche per la WiFi, credo che l'HW continui a funzionare regolarmente, solo che da SW, non si ricevono più le connessioni

come l'ethernet? allora basta vedere se l'ip risponde ai ping. Se si il problema è solo lato libreria

Eccomi qua.
Appena tornato a casa :wink:

Per ora Arduino sta ancora funzionando...

Ho fatto una piccolissima modifica allo sketch originale WebServer della IDE 1.0.4:
Dopo if (client) ho aggiunto digitalWrite(3, HIGH); //appena un client http si connette, accende il LED sul PIN 3

Dopo client.println(""); ho aggiunto digitalWrite(3, LOW); //quando ha finito di mandare la pagina html, spegne il LED sul PIN 3

Oltre a questo, alla fine dello sketch dentro loop() ho aggiunto:

if (dir == 0) {
    loops ++;
    if (loops > 10000) { dir = 1; loops = 1; digitalWrite(6, HIGH);}
  }
  if (dir == 1) {
    loops --;
    if (loops < 1) { dir = 0; digitalWrite(6, LOW);}
  }

Che mi conta quante volte e' stato eseguito loop() ed ogni 10.000 esecuzioni, mi fa un breve blink al LED collegato al PIN 6.

In questa maniera, se il LED al PIN 3 smette di lampeggiare, so che la EthernetShield ha smesso di dialogare con la UNO.
Se il LED al PIN 6 smette di lampeggiare, so che la loop() ha smesso di loopare :smiley:

pablos:
Guarda sono diventato pazzo come te con sta scheda ......... l'unico modo che fino ad ora non ha mai fallito è questo

Ethernet.begin(mac,ip);

prova così però non fare come altri che poi spariscono e non sappiamo mai se ha migliorato la condizione o meno ci interessa sapere come è andata :slight_smile:

Tranquillo, non sparisco !

Io in realta' pensavo di eseguire ethernet begin, ad ogni richiesta http, dopo che ho finito di mandare i dati al client.... Convinto che si trattasse di un blocco dovuto a troppe connessioni (quando quell' Arduino era raggiungibile via WEB)

Mettere un ethernet begin ogni tot minuti, non mi piace, in quanto potrebbe resettarmi la scheda proprio nel momento in cui sto trasferendo dati... non mi piace.

Torna l' idea di far fare a quell' Arduino una richiesta ad un server http esterno, in caso di mancata risposta, faccio un ethernet begin.

to be continued ...

ok, ho riesaumato una eth shield v1.1, vediamo cosa succede. Mettiamoci d'accordo sullo sketch: prima di tutto dobbiamo rendere il problema riproducubile.

prima di tutto che IDE usiamo? io dire la 1.0.4 finchè non esce la 1.0.5 ufficialmente nella pagina download

La butto li, ma se fosse semplicemente che, con la librerie standard, non si riesce a gestire più connessioni simultaneamente?
Mi spiego meglio: continuando quanto scritto qui http://arduino.cc/forum/index.php/topic,154157.0.html potrebbe essere che facendo così

EthernetClient client = server.available()

Si vada a prendere sempre la stessa connessione, quindi in caso di connessioni simultanee se ne gestirebbe una sola.

Un'altra idea potrebbe essere che il protocollo TCP, per come è fatto (se non erro, altrimenti smentitemi pure... ;)) non prevede un timeout di connessione, quindi se un client non chiude la connessione questa rimane attiva e facendo sempre la server.available() la classe tornerà sempre la connessione "morta".

Per test provate a collegarvi via HyperTerminal all'IP di Arduino sulla porta 80, magari ad inviare anche qualcosa per farvi rispondere (tipo HTTP POST, non conosco le sintassi HTML) ma senza chiudere la connessione, se ho ragione non dovrebbe più rispondervi da browser...

EDIT: Ho allegato la mia libreria EthernetServer modificata, e una libreria che mi sono fatto per gestire più agevolmente le connessioni simultanee in quanto avevo l'esigenza di assegnare determinati socket ad un server ed altri ad un altro server. Provate a dargli un'occhiata se può farvi comodo...

EthernetServer.h (627 Bytes)

EthernetServer.cpp (3.45 KB)

EthernetServerSocket.cpp (1.14 KB)

EthernetServerSocket.h (1.15 KB)

come non detto, i mie shield farlocchi sono ENC28J60, non wiznet :roll_eyes: