Go Down

Topic: Come utilizzare la ethernet? (Read 1 time) 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é?

lestofante

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
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Janos

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

lestofante

Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

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

lestofante

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
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Janos

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

lestofante

Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

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.

lestofante

mai fidarsi dei client...

anche i browser se usano il protocollo HTTP/1.1 non chiudono la connessione..
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Go Up