Ethernet shield smette di rispondere

Salve a tutti

Ho costruito un tiny web server statico su sd utilizzando librerie esistenti: - connessione persistente - diverse sub pagine - datalog su sd degli eventi - consolle dei comandi - visualizzazione in tempo reale di tutte le stringhe trasmesse e ricevute tra Arduino e client su un textarea html

il client alla connessione si carica la pagina html, la libreria jquery.js e il mio script js che ogni 200 millisecondi fa una richiesta ad Arduino di inviargli i dati sullo status delle porte analogiche digitali ecc vedendo a video praticamente in tempo reale qualsiasi variazione di temperature o stato delle porte con metodo GET, fin qui nessun problema funziona per giorni senza mai fermarsi.

Il problema nasce quando invio i dati da web, premo un tasto e con metodo POST invio una stringa ad Arduino la riconosce ed esgue, ma solo per 4 volte poi Arduino non risponde più. L'aggiornamento web si pianta (la ethernet shield non si inchioda perchè basta un refresh per tornare normale)

Invio stringhe fissate a 10 caratteri, ma sembrano essere troppi perchè se ristrutturo il programma Arduino a riceverne solo 5 caratteri funziona tutto egregiamente anche con più client connessi che siano pc fissi o smartphone (tutti vengono aggiornati in tempo reale) In definitiva con 5 caratteri ottengo sul jquery.js un success: function(), con 10 o più caratteri ottengo un error: function()

La mia domanda è (perdonando i termini poco consoni) può essere che si intasi il buffer della ethernet, può essere che la stringa sia davvero troppo lunga? Purtroppo con soli 5 caratteri ci faccio poco e niente.

ciao, grazie

Mi puzza di un array troppo piccolo dove scrivi troppi date e sovrascrive le variabili poste dopo nella memoria.
Oppure hai usato troppa memoria RAM.

Ciao Uwe

Faccio il debug per vedere cosa arriva sulla ethernet e sono sicuro che sono solo quei 10,

pezzo del data.js

var url = "/ClientComand"; var dato= "P0040"; //--------esempio di dato inviato $.ajax({ type: "POST", data: dato, dataType: "text", cache: false, url: url, success: function(r) { document.modulo.areatesto.value += "Invio ad Arduino POST >> URL = "+ url + ">> " + dato +"\n"; }, error: function() { document.modulo.areatesto.value += "POST fallito: "; }

per renderlo più chiaro possibile ho preso ogni singolo carattere provvisoriamente

pezzo sullo sketch:

if (client.available()) {

D1 = (char)client.read(); D2 = (char)client.read(); D3 = (char)client.read(); D4 = (char)client.read(); D5 = (char)client.read(); //D6 = (char)client.read(); //D7 = (char)client.read(); //D8 = (char)client.read(); //D9 = (char)client.read(); //D10 = (char)client.read();

if (D1 == "A") Out_Analog_port(); // if (D1 == "C") Consolle_msg(); //interpreta i messaggi da consolle inviati da web if (D1+D2+D3 == "err") Consolle_msg_err(); //D4 e D5 sono i codici errori interpretati da sketch if (D1 == "P") commutaz_Out_dig_port(); }

dentro le funzioni poi interpreto singolarmente i restanti 4 caratteri, ovviamente allungo lo sketch in questo modo per fargli interpretare tutti i codici, se leggesse direttamente la stringa sarebbe più semplice, cmq con questi 5 funziona bene. Se aggiungo gli altri 5 e aggiungo 5 caratteri sulla stringa inviata si pianta.

Vorrei provare a mettere un carattere di arresto, ma come faccio a sapere qual'è l'effettiva lunghezza del messaggio? come faccio a fermare il char)client.read(); quando leggo il carattere di arresto? é possibile svuotare il buffer della ethernet una volta ricevuto il messaggio? o lo fa già da solo?

il programma non è eccessivamente lungo

Binary sketch size: 30434 bytes (of a 258048 byte maximum)

ciao