Go Down

Topic: Come utilizzare la ethernet? (Read 590 times) previous topic - next topic

Janos

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

Code: [Select]

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é?

lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Janos

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

lesto

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Janos

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...

lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Janos

:smiley-eek-blue: Stamani non c'era la 1.0.4...

lesto

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Janos

Per i posteri, ho risolto. Io problema era come utilizzavo la Ethernet. Mi spiego meglio: io facevo una cosa così strutturata:

Code: [Select]

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

Code: [Select]

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.

lesto

mai fidarsi dei client...

anche i browser se usano il protocollo HTTP/1.1 non chiudono la connessione..
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up