Come utilizzare la ethernet?

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ì:

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x97, 0xFB };
IPAddress ip(10,10,10, 157);

EthernetServer MbServer(502);

byte ByteSendReceiveArray[100];

void setup() {
  Ethernet.begin(mac, ip);
  MbServer.begin();
};

void loop() {
  EthernetClient client = MbServer.available();

  if (!client) return;

  while (client.available()) {
    ByteSendReceiveArray[ByteRicevuti++] = client.read();
  }

  /*
  quello che devo fare...
  */

};

Il tutto funziona per un po di cicli e poi smette di rispondere... Perché?

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

Intanto, come si chiude la connessione? Con client.stop()?

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

:fearful: Stamani non c'era la 1.0.4...

lo so :stuck_out_tongue:

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.

mai fidarsi dei client...

anche i browser se usano il protocollo HTTP/1.1 non chiudono la connessione..