[Risolto] Webduino problema con debug attivato

Salve a tutti, vi espongo il mio strano (almeno secondo me è strano) problema.
Sto facendo degli esperimenti con arduino e ethernet shield, in questo momento sto testando uno sketch che mi faccia da webserver rispondendo alle connessioni in entrata con una pagina html caricata sulla scheda sd e accenda un led rgb leggendo i dati POST ricevuti dal browser.
Fin qui tutto ok, dopo varie ottimizzazioni tutto funziona a dovere, il problema è sorto quando per comprendere al meglio il funzionamento del protocollo http ho attivato il debug della libreria webduino inserendo nel codice

#define WEBDUINO_SERIAL_DEBUGGING 2

La cosa strana è che se la modalità debug la imposto con 1 tutto funziona correttamente, il browser visualizza la pagina, il led si accende e sul monitor seriale leggo le informazioni di debug mentre in “modalità 2” alla connessione il browser visualizza una serie di caratteri non definiti e sul monitor seriale ottengo una parte delle informazioni che però vengono interrotte non sempre allo stesso punto. Per chiarezza vi posto il mio codice

#include <SD.h>
#include "SPI.h"
#include "Ethernet.h"
#define WEBDUINO_SERIAL_DEBUGGING 2
#define WEBDUINO_FAVICON_DATA ""
#include "WebServer.h"

// CHANGE THIS TO YOUR OWN UNIQUE VALUE
static uint8_t mac[6] = { 0x02, 0xAA, 0xBB, 0xCC, 0x00, 0x22 };

// CHANGE THIS TO MATCH YOUR HOST NETWORK
static uint8_t ip[4] = { 192, 168, 1, 99 }; // area 51!

/* all URLs on this server will start with /rgb because of how we
 * define the PREFIX value.  We also will listen on port 80, the
 * standard HTTP service port */
#define PREFIX "/led"

WebServer webserver(PREFIX, 800);

#define RED_PIN 5
#define GREEN_PIN 6
#define BLUE_PIN 7

int red = 0;            //integer for red darkness
int blue = 0;           //integer for blue darkness
int green = 0;          //integer for green darkness
String nome;
File htmlFile;
File logFile;

/* This command is set as the default command for the server.  It
 * handles both GET and POST requests.  For a GET, it returns a simple
 * page with some buttons.  For a POST, it saves the value posted to
 * the red/green/blue variable, affecting the output of the speaker */
void rgbCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  if (type == WebServer::POST)
  {
    bool repeat;
    char name[16], value[16];
    do
    {
      /* readPOSTparam returns false when there are no more parameters
       * to read from the input.  We pass in buffers for it to store
       * the name and value strings along with the length of those
       * buffers. */
      repeat = server.readPOSTparam(name, 16, value, 16);

      /* this is a standard string comparison function.  It returns 0
       * when there's an exact match.  We're looking for a parameter
       * named red/green/blue here. */
      if (strcmp(name, "color") == 0)
      {
        switch(strtoul(value,NULL,10))
        {
          case 1:
          red    = 255;
          green  = 0;
          blue   = 0;
          break;
          
          case 2:
          red    = 0;
          green  = 255;
          blue   = 0;
          break;
          
          case 3:
          red    = 0;
          green  = 0;
          blue   = 255;
          break;
          
          case 4:
          red    = 255;
          green  = 255;
          blue   = 0;
          break;
          
          case 5:
          red    = 0;
          green  = 255;
          blue   = 255;
          break;
          
          case 6:
          red    = 255;
          green  = 0;
          blue   = 255;
          break;
          
          case 7:
          red    = 255;
          green  = 255;
          blue   = 255;
          break;
          
          case 8:
          red    = 255;
          green  = 128;
          blue   = 0;
          break;
          
          case 9:
          red    = 0;
          green  = 0;
          blue   = 0;
          break;
          
          default:
          red    = 0;
          green  = 0;
          blue   = 0;
        }
        logFile = SD.open("log.txt", FILE_WRITE);
        if (logFile){
          logFile.print(nome);
          logFile.print(" red=");
          logFile.print(red);
          logFile.print(" green=");
          logFile.print(green);
          logFile.print(" blue=");
          logFile.println(blue);
          logFile.close();
        }
          
      }
      if (strcmp(name, "nome") == 0){
        //Serial.println(value);//*****************************************************************************************************+
        nome = value;
      }      
    } while (repeat);
    
    // after procesing the POST data, tell the web browser to reload
    // the page using a GET method. 
    server.httpSeeOther(PREFIX);
//    Serial.print(name);
//    Serial.println(value);

    return;
  }

  /* for a GET or HEAD, send the standard "it's all OK headers" */
  server.httpSuccess();

  /* we don't output the body for a HEAD request */
  if (type == WebServer::GET)
  { htmlFile = SD.open("index.htm");
    while(htmlFile.available()){
      char pagina = htmlFile.read();
      server.write(pagina);
      //Serial.print(c);//*************************************************************************************************************
   }
  }
  htmlFile.close();
}

void setup()
{
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
  pinMode(10, OUTPUT); // set the SS pin as an output (necessary!)
  digitalWrite(10, HIGH); // but turn off the W5100 chip!
  SD.begin(4);
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  
  webserver.setDefaultCommand(&rgbCmd);

  /* start the server to wait for connections */
  webserver.begin();
}

void loop()
{
  // process incoming connections one at a time forever
  webserver.processConnection();
//  Serial.print(red);
//  Serial.print(" ");
//  Serial.print(green);
//  Serial.print(" ");
//  Serial.println(blue);
  analogWrite(RED_PIN, red);
  analogWrite(GREEN_PIN, green);
  analogWrite(BLUE_PIN, blue);
}

mentre questo è quello che leggo sul monitor seriale

GET /led *** requestType = 1, request = "/led" ***
HTTP/1.1<CR><LF>
Host: 192.168.1.99:800<CR><LF>
Connection: keep-alive<CR><LF>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<CR><LF>
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17<CR><LF>
Accept-Encoding: gzip,deflate,sdch<CR><LF>
Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4<CR><LF>
Accept-Charset: ISO-8859-1,utf-

A questo punto devo resettare Arduino in quanto si blocca.
Analizzando la libreria mettendo la modalità debug 2 l’unica cosa che cambia è che ci sono alcuni Serial.print in più per avere maggiori dettagli e non capisco perchè questo mi blocchi il programma.
Quindi ai coraggiosi che hanno avuto la forza di arrivare fino in fondo chiedo se grazie alla vostra esperienza saprete darmi un consiglio.

ad occhio hai finito la RAM. Cerca sul playground le funzioni per tenerla d'occhio e controlla se quello è il problema.

--> http://www.leonardomiliani.com/2012/come-sapere-loccupazione-di-ram-del-proprio-sketch/

:roll_eyes: Confermo... riducendo il codice qua e la, togliendo qualche variabile e ridimensionando gli array tutto diventa stabile. Abituato com'ero a scrivere in assembler programmini stupidi non mi sono mai posto il problema della ram. Grazie per la cortese attenzione. ^_^

Se ti va puoi postare il codice funzionante. Non si sa mai che fosse utile a qualcun'altro. :grin:

Mmm, ni... Cioè il codice senza debug attivato funziona, mentre per capire se il problema era la ram che finiva ho tolto anche parti di codice per ridurne l'uso ma di conseguenza ho ridotto anche la funzionalità del programma. Resta comunque una cosa strana (almeno per me) che un paio di Serial.print in più esauriscano la ram.

non è la serial print in se ma la necessità di salvare in ram la stringa da stamnpare. usa la F() e il problema dovrebbe sparire