COM

Salve a tutti, ho caricato uno sketch all'ethernet shield che funziona correttamente, ma c'è un piccolo problema. Posso effettuare richieste ad arduino, solo ed esclusivamente se apro il monitor seriale dall'IDE.
La mia domanda è: l'ethernet shield funziona così o c'è qualcosa che non va? Mi sembra molto strano dotare arduino di una ethernet shield e farlo funzionare solo mediante un monitor seriale di un pc.
Grazie a tutti per l'attenzione.

vedere programma prego :slight_smile:

Forse nel setup() hai lasciato while (!Serial){ ; }

nid69ita:
Forse nel setup() hai lasciato while (!Serial){ ; }

ho cancellato la stringa. ma quando lo interrogo per la seconda volta non worka.

Patrick_M:
vedere programma prego :slight_smile:

#include <SPI.h>
#include <Ethernet.h>
#include <string.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

EthernetServer server(80);
//ho messo un buffer di 30 per avere della tolleranza sulla lunghezza della stringa. A 22
//non ci sarebbe stato il carattere terminatore '\0'
char dataGet[30];
char prova[30];
char carattere='=';
char *ret; 
int q=0; 
int j=1,l;
bool readRequest(EthernetClient &client){
  int i = 0;
  //Serial.println(client.available());
  //Controllo che il client sia connesso
  while (client.connected()){
    if (client.available()){
    char c = client.read();
    //controllo che sia iniziata la stringa GET
    if (c == '?'){
      //Fino a che non incontro lo spazio che termina la query GET aggiungo i caratteri a dataGet
      for(i=0; i<80; i++){
        c = client.read();
        if(c!=32){
          dataGet[i] = c;
          //Serial.print(dataGet[i]);
        }else{
          dataGet[i] = '\0';
          break;
          }
      }
      ret=strchr(dataGet, carattere);
      l=strlen(ret);
      while(client.available()){
          client.read(); 
      }
    return true;
    }
    } 
  }
  return false; 
}

void writeResponse(EthernetClient &client){
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<body>");
  while(j!=(l))
  {
    if((ret[j]==37) && (ret[j+1]=='2') && (ret[j+2]=='0'))
    {
      prova[q]=' ';
      q++;
    }
    else
    {
      if((ret[j]=='2') or (ret[j]=='0'))
      {
        
      }
      else
      {
        prova[q]=ret[j];
        q++;
      }
    }
    j++;
  }
  for(int e=0;e<q+1;e++)
  {
    client.print(prova[e]);
  }
  client.println(ret);
  client.println("</body>");
  client.println("</html>");
}
void writeLOL(EthernetClient &client){
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<body>");
  client.println("work");
  client.println("</body>");
  client.println("</html>");
}

void setup() {
  // Open serial communications and wait for port to open:
  

  // start the Ethernet connection and the server:
  Ethernet.begin(mac,ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  //Attendo la richiesta del client
  if (client) {
    Serial.println(F("Nuovo client"));
    bool success = readRequest(client);
    Serial.print(F("Richiesta eseguita"));
    //Se la richiesta viene correttamente processata scrivo il responso
    if (success == true){
      writeResponse(client);
  }
  else
  {
    writeLOL(client);
  }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println(F("client disconnected"));
    Serial.println(dataGet);
  }
}

Premessa, io faccio solo richieste ad arduino con il metodo GET. Quindi so che non worka se lo interrogo senza alcun variabile, ciò che non capisco è perchè dopo la prima richiesta tutte le altre non vanno a buon fine

void setup() {
  // Open serial communications and wait for port to open:
 

  // start the Ethernet connection and the server:
  Ethernet.begin(mac,ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

hai cancellato troppo....
qui manca la Serial.begin(velocità) :smiley:

xAstyle:
Posso effettuare richieste ad arduino, solo ed esclusivamente se apro il monitor seriale dall'IDE.
...
ciò che non capisco è perchè dopo la prima richiesta tutte le altre non vanno a buon fine

Chiarisci bene cosa fai e cosa ottieni: il problema è il primo (funziona solo se apri il monitor seriale) o il secondo (funziona comunque, ma non risponde alla seconda GET) o entrambe (risponde solo al primo GET e se hai il monitor seriale collegato)?

A parte il Serial.begin() mancante, se lo rimetti che cosa vedi sulla seriale quando fai il primo GET (ovviamente con i parametri che si aspetta) e cosa al secondo (anche questo immagino/spero con i parametri attesi)?

xAstyle:
Salve a tutti, ho caricato uno sketch all'ethernet shield che funziona correttamente, ma c'è un piccolo problema.
...
uindi so che non worka se lo interrogo senza alcun variabile,

Ehm... Per essere più precisi, il programma (anche se su Arduino si usa il termine "sketch", scusa per me è improprio e inutile, preferisco un semplice "programma", o se si parla del codice "listato" o "sorgente" :slight_smile: ) non lo carichi "sullo shield", ma su Arduino. Poi non te la prendere ma "worka" dai, nun se pò sentì... :slight_smile:

xAstyle:
ho cancellato la stringa. ma quando lo interrogo per la seconda volta non worka.

#include <SPI.h>

#include <Ethernet.h>
#include <string.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

EthernetServer server(80);
//ho messo un buffer di 30 per avere della tolleranza sulla lunghezza della stringa. A 22
//non ci sarebbe stato il carattere terminatore '\0'
char dataGet[30];
char prova[30];
char carattere='=';
char *ret;
int q=0;
int j=1,l;
bool readRequest(EthernetClient &client){
  int i = 0;
  //Serial.println(client.available());
  //Controllo che il client sia connesso
  while (client.connected()){
    if (client.available()){
    char c = client.read();
    //controllo che sia iniziata la stringa GET
    if (c == '?'){
      //Fino a che non incontro lo spazio che termina la query GET aggiungo i caratteri a dataGet
      for(i=0; i<80; i++){
        c = client.read();
        if(c!=32){
          dataGet[i] = c;
          //Serial.print(dataGet[i]);
        }else{
          dataGet[i] = '\0';
          break;
          }
      }
      ret=strchr(dataGet, carattere);
      l=strlen(ret);
      while(client.available()){
          client.read();
      }
    return true;
    }
    }
  }
  return false;
}

void writeResponse(EthernetClient &client){
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("");
  client.println("");
  client.println("");
/*
  while(j!=(l))
  {
    if((ret[j]==37) && (ret[j+1]=='2') && (ret[j+2]=='0'))
    {
      prova[q]=' ';
      q++;
    }
    else
    {
      if((ret[j]=='2') or (ret[j]=='0'))
      {
        //Perchè qua non fai nulla???
      }
      else
      {
        prova[q]=ret[j];
        q++;
      }
    }
    j++;
  }
//Non serve che fai il ciclo for. Con client.print(prova) ti printa la variabile completa.
  for(int e=0;e<q+1;e++)
  {
    client.print(prova[e]);
  }*/
  client.println(ret);
  client.println("");
  client.println("");
}
void writeLOL(EthernetClient &client){
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();
  client.println("");
  client.println("");
  client.println("");
  client.println("work");
  client.println("");
  client.println("");
}

void setup() {
  // Open serial communications and wait for port to open:

// start the Ethernet connection and the server:
  Ethernet.begin(mac,ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  //Attendo la richiesta del client
  if (client) {
    Serial.println(F("Nuovo client"));
    bool success = readRequest(client);
    Serial.print(F("Richiesta eseguita"));
    //Se la richiesta viene correttamente processata scrivo il responso
    if (success == true){
      writeResponse(client);
  }
  else
  {
    writeLOL(client);
  }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println(F("client disconnected"));
    Serial.println(dataGet);
  }
}



Premessa, io faccio solo richieste ad arduino con il metodo GET. Quindi so che non worka se lo interrogo senza alcun variabile, ciò che non capisco è perchè dopo la prima richiesta tutte le altre non vanno a buon fine

Ciao!!! Direi che il problema è nelle righe che ti ho commentato. Se le commenti il problema del blocco dopo la prima richiesta non si verifica più.
Potresti spiegare bene cosa fa quella parte??? Non riesco a capire cosa verifichi e cosa fai.
Inoltre la stringa prova da quello che vedo tu non la termini mai con il terminatore '\0'.
Non ti conveniva usare strtok_r??? Così come hai fatto tu puoi riceve una sola variabile della query GET. E comunque se ti basta una sola variabile puoi comunque usare strtok usando come separatore l'=
Ciao!!!

nid69ita:
Forse nel setup() hai lasciato while (!Serial){ ; }

Preciso ancora una volta: questa riga causerebbe il blocco dello sketch fino all'apertura della seriale solo su Leonardo, Micro, Due e altre schede con seriale CDC. Sulla Uno & Co. non fa assolutamente niente.