Azzeramento strano di una variabile

In questo codice ho la variabile subnet che passando nel case 2 me la setta correttamente ma nel case 3 mi azzera subnet[0] anziche' 255.

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

byte ip[] = { 192, 168, 1, 177 }; //Indirizzo scheda di rete
byte gateway[] = { 192, 168, 1, 1 }; //Indirizzo Gateway
byte subnet[] = { 255, 255, 255, 0 }; //Subnet Mask Maschera di rete
byte DNS[] = { 8, 8, 8, 8 }; //DNS opendns
static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //MAC Address

const int SD_CS = 4; // pin 4 is the SPI select pin for the SDcard
const int ETHER_CS = 10; // pin 10 is the SPI select pin for the Ethernet

void ReadNetwork() {
/* contenuto del file
12:34:56:78:90:AB
192.168.1.43
255.255.255.0
192.168.1.1
8.8.8.8
*/
  pinMode(ETHER_CS,OUTPUT);
  digitalWrite(ETHER_CS,HIGH);
  if(!SD.begin(4)) Serial.println("SD fail read network.ini");
  else Serial.println("SD ok");
  
  File fh = SD.open("network.ini",FILE_READ);
  char netBuffer[32];
  
  if(!fh)
  {
    Serial.println("SD open fail");
    return;    
  }
  else Serial.println("ho aperto network.ini");
  int chPos = 0;
  int lineNo = 0;
  while(fh.available())
  {
    char ch = fh.read();
    if(ch == '\r') { //uso lo spazio (\b) per delimitare stringa
      chPos = 0;
      switch(lineNo) {
        case 0:
//          Serial.print("mac ");        
  sscanf(netBuffer,"%2x:%2x:%2x:%2x:%2x:%2x",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);  
  Serial.print ("\r\nAnalisi Variabili Netmask case 0\r\n");
 Serial.println(subnet[0]);
Serial.println(subnet[1]);
Serial.println(subnet[2]);
Serial.println(subnet[3]);
break;
        case 1:
//          Serial.print("ip ");        
  sscanf(netBuffer,"%u.%u.%u.%u",&ip[0],&ip[1],&ip[2],&ip[3]);  
  Serial.print ("\r\nAnalisi Variabili Netmask case 1\r\n");
  Serial.println(subnet[0]);
Serial.println(subnet[1]);
Serial.println(subnet[2]);
Serial.println(subnet[3]);
        break;
        case 2:
//          Serial.print("netmask ");        
   sscanf(netBuffer,"%u.%u.%u.%u",&subnet[0],&subnet[1],&subnet[2],&subnet[3]);  
  Serial.print ("\r\nAnalisi Variabili Netmask case 2\r\n");
Serial.println(subnet[0]);
Serial.println(subnet[1]);
Serial.println(subnet[2]);
Serial.println(subnet[3]);
        break;
        case 3:
//          Serial.print("gateway ");        
  sscanf(netBuffer,"%u.%u.%u.%u",&gateway[0],&gateway[1],&gateway[2],&gateway[3]);  
  Serial.print ("\r\nAnalisi Variabili Netmask case 3\r\n");
Serial.println(subnet[0]);
Serial.println(subnet[1]);
Serial.println(subnet[2]);
Serial.println(subnet[3]);
        break;
        case 4:
//       Serial.print("DNS ");        
  sscanf(netBuffer,"%u.%u.%u.%u",&DNS[0],&DNS[1],&DNS[2],&DNS[3]);  
  Serial.print ("\r\nAnalisi Variabili Netmask case 4\r\n");
Serial.println(subnet[0]);
Serial.println(subnet[1]);
Serial.println(subnet[2]);
Serial.println(subnet[3]);
        break;
      }
      Serial.println(lineNo); //Visualizza numero riga
      Serial.println(netBuffer); //Visualizza contenuto riga
      lineNo++; //Incrementa riga per il case
    }
    else if(ch == '\n') {
      // do nothing
    }
    else if(chPos < 31) {
      netBuffer[chPos] = ch;
       chPos++;
      netBuffer[chPos] = 0;
    }
  }
  Serial.print ("\r\nAnalisi Variabili Netmask passo 4\r\n");
Serial.println(subnet[0]);
Serial.println(subnet[1]);
Serial.println(subnet[2]);
Serial.println(subnet[3]);
  
  fh.close(); //Chiude il file
  Serial.print ("\r\nAnalisi Variabili Netmask passo 5\r\n");
Serial.println(subnet[0]);
Serial.println(subnet[1]);
Serial.println(subnet[2]);
Serial.println(subnet[3]);

  int x;
  Serial.print("\r\nmac ");
  for(x=0;x<6;x++) {
    Serial.print(mac[x],HEX);
    if(x<5) Serial.print(":");
  }

  Serial.print("\r\nip ");
  for(x=0;x<4;x++) {
    Serial.print(ip[x],DEC);
    if(x<3) Serial.print(".");
  }
  Serial.print ("\r\nAnalisi Variabili Netmask \r\n");
Serial.println(subnet[0]);
Serial.println(subnet[1]);
Serial.println(subnet[2]);
Serial.println(subnet[3]);
  Serial.println ("Compilazione Netmask");
  Serial.println (x);

  Serial.print("\r\nnetmask ");
  for(x=0;x<4;x++) {
    Serial.print(subnet[x],DEC);
    if(x<3) Serial.print(".");
  }

  Serial.print("\r\ngateway ");
  for(x=0;x<4;x++) {
    Serial.print(gateway[x],DEC);
    if(x<3) Serial.print(".");
  }

  Serial.print("\r\ndns ");
  for(x=0;x<4;x++) {
    Serial.print(DNS[x],DEC);
    if(x<3) Serial.print(".");
  }

  Serial.println(Ethernet.localIP());
  Serial.println(Ethernet.subnetMask());
  Serial.println(Ethernet.gatewayIP());
  Serial.println(Ethernet.dnsServerIP());


  Serial.println("\r\nStarting ethernet");
  Ethernet.begin(mac,ip,DNS,gateway,subnet);
  digitalWrite(10,HIGH);

  Serial.println(Ethernet.localIP());
  Serial.println(Ethernet.subnetMask());
  Serial.println(Ethernet.gatewayIP());
  Serial.println(Ethernet.dnsServerIP());
}


void setup(){
  
  Serial.begin(57600);
  //ReadConfig();
  ReadNetwork();
}
void loop(){

}

Chi sa dirmi il perche?

ho lo stesso problema sia su Arduino 1.0.5 che su 1.5.5
hardware (ma dubito che centri) arduino mega e rete 5100
Grazie anticipo e ah...
buon fine anno e buon inizio 2014 a tutti

Ho provato di tutto e non capisco il perche'..
ho azzerato le subnet[0],1,2,3 a monte, ho appunto scritto:
Serial.println(subnet[0]);
Serial.println(subnet[1]);
Serial.println(subnet[2]);
Serial.println(subnet[3]);

anziche' cicli for per evitare ogni possibile svista o errore... ma non riesco proprio a trovare il perche' me la azzera e solo la variabile subnet[0] le altre le lascia corrette tutte e quante.

Riverifica i contenuti del file.
Nel case 3, sei sicuro che la netBuffer contenga "192.168.1.1" ?

Altro tentativo, nel case 3 commenta la sscanf dentro a gateway, per vedere se è quella la causa.

Un consiglio sulla ReadNetwork(), io la farei che ritorna un intero, 0 se tutto okay, else un valore >0:

if(!SD.begin(4)) 
  { Serial.println("SD fail read network.ini");
    return 1;    // 1=errore no file
  }
  else 
  { Serial.println("SD ok");
  }
  File fh = SD.open("network.ini",FILE_READ);
  char netBuffer[32];
  if(!fh)
  { Serial.println("SD open fail");
    return 2;    // 2=open fail
  }

Alla fine della funzione un return 0; se tutto okay

Nella lettura (nel tuo setup) se ritorna 0 okay else metti il programma in while infinito, ovvero blocchi il micro, magari accendendo un led spia.

  //ReadConfig();
  if( ReadNetwork()>0)   // se >0 errore
  { digitalWrite(pinSpia,HIGH);
    while(1) ;   // blocca micro con ciclo infinito, tanto non ha senso proseguire
  }

Dovresti prima leggere tutta la riga e immagazzinarla in netbuffer e poi al passo successivo interpretarla con sscanf.
Cambia l'ordine degli IF, metti prima i casi più probabili.

Grazie per la risposta.
Rispiego meglio:
Se all'inizio della procedura azzero le variabili con:

subnet[0] = 0;
subnet[1] = 0;
subnet[2] = 0;
 subnet[3] = 0;

ottengo subito dopo il case 2 ovvero:

       case 2:
//          Serial.print("netmask ");        
   sscanf(netBuffer,"%u.%u.%u.%u",&subnet[0],&subnet[1],&subnet[2],&subnet[3]);  
  Serial.print ("\r\nAnalisi Variabili Netmask case 2\r\n");
Serial.println(subnet[0]);
Serial.println(subnet[1]);
Serial.println(subnet[2]);
Serial.println(subnet[3]);
        break;

ottengo le variabili corrette lette nel file.
Ma appena rifaccio il monitoraggio nel case 3 mi trovo la prima variabile azzerata
ovvero subnet[0] risulta uguale a zero mentre le altre 3 restano corrette.
Non e' un errore di procedura gli altri case ovvero mac, ip, dns, gateway vengono eseguiti correttamente ho i valori letti nel file e tutti perfetti
solo quella cavolo di subnet[0] che si azzera
Se copiate il codice lo potete provare e vedrete che succede...
ho messo i serial.print per visualizzare che succede...

Grazie mille

nid69ita:
Riverifica i contenuti del file.
Nel case 3, sei sicuro che la netBuffer contenga "192.168.1.1" ?
Altro tentativo, nel case 3 commenta la sscanf dentro a gateway, per vedere se è quella la causa.

Ripeto, hai fatto queste prove? Risultato?

si ho verificato i contenuti...
e si remmando il
// sscanf(netBuffer,"%u.%u.%u.%u",&gateway[0],&gateway[1],&gateway[2],&gateway[3]);
non azzera la netmask 0 ma non ha senso...
se mi spieghi il perche' ti ringrazio

Secondo me stai pasticciando con i puntatori e le locazioni di memoria.
Non ho mai utilizzato sscanf quindi non ti saprei dire dov'è l'errore. :frowning:

oh, beh, sembra strano anche a me, ma aver beccato dove salta fuori l'inghippo è già molto.
A prima vista non mi sembra di vedere cavolate. Certo il leggere dopo il netBuffer rispetto ai case non semplifica il debug.
In memoria i due array sono vicini, prova a metterci in mezzo qualcosa. Tanto per provare:

byte gateway[] = { 192, 168, 1, 1 }; //Indirizzo Gateway
byte cavolata[]={1,1,1,1};  // per mettere in mezzo qualcosa
byte subnet[] = { 255, 255, 255, 0 }; //Subnet Mask Maschera di rete

E vedi se cosi subnet non si sporca.
Sembra che quando fai sscanf() di gateway per qualche motivo va a scrivere oltre ultimo elemento (in memoria dopo gateway c'e' appunto subnet)

Puoi anche provare a scrivere così, è equivalante:
invece di:

sscanf(netBuffer,"%u.%u.%u.%u",&gateway[0],&gateway[1],&gateway[2],&gateway[3]);
sscanf(netBuffer,"%u.%u.%u.%u",gateway+0,gateway+1,gateway+2,gateway+3);

Non ho mai utilizzato sscanf, ma visto che i vettori vengono passati comnque per riferiemento non potrebbe funzionare anche così?

sscanf(netBuffer, "%u.%u.%u.%u", gateway);

Aggiornamento....
Ho spostato la netmask in fondo.
prima :
12:34:56:78:90:AB
192.168.1.43
255.255.255.0
192.168.1.1
8.8.8.8
rispettivamente mac, ip, netmask, gateway, dns
a cosi':
12:34:56:78:90:AB
192.168.1.43
192.168.1.1
8.8.8.8
255.255.255.0
ovvero mac, ip, gateway, dns, netmask

e magia....non va piu' il dns ovvero mi azzera la prima variabile del dns

a sto punto non e' per caso che sia qualche casino di win e CR LF o qualche amenicolo vario????
che sia nel file il problema? come faccio a renderlo compatibile al 100% ?

PaoloP:
Non ho mai utilizzato sscanf, ma visto che i vettori vengono passati comnque per riferiemento non potrebbe funzionare anche così?

sscanf(netBuffer, "%u.%u.%u.%u", gateway);

Si, ma essendoci quattro %u, devi passare 4 variabili, come nell'esempio che ho scritto prima, passando gateway, gateway+1, gateway+2 e gateway+3
La funzione sfrutta i parametri a numero variabile varsarg o come cavolo si chiama.

@elpapais dovresti leggere il file con un programma tipo FileAlyzer (free) che ti permette di vederne ogni singolo byte.
Se ci sono problemi con /r/n o altro, è difficile da dirsi. Scarti /n potresti verificare se ci sono altri elementi nel file.
Comunque il problema dovrebbe esserci per ogni riga, non solo per la terza.

nid69ita:

PaoloP:
Non ho mai utilizzato sscanf, ma visto che i vettori vengono passati comnque per riferiemento non potrebbe funzionare anche così?

sscanf(netBuffer, "%u.%u.%u.%u", gateway);

Si, ma essendoci quattro %u, devi passare 4 variabili, come nell'esempio che ho scritto prima, passando gateway, gateway+1, gateway+2 e gateway+3
La funzione sfrutta i parametri a numero variabile varsarg o come cavolo si chiama.

@elpapais dovresti leggere il file con un programma tipo FileAlyzer (free) che ti permette di vederne ogni singolo byte.
Se ci sono problemi con /r/n o altro, è difficile da dirsi. Scarti /n potresti verificare se ci sono altri elementi nel file.
Comunque il problema dovrebbe esserci per ogni riga, non solo per la terza.

Hai ragione ma adesso che ho spostato la netmask su l file (e logicamente la logica su arduino), mi sbarella non piu' la mask ma la prima cifra del dns...

ho analizzato il file con FileAlyzer e non sembra esserci nulla di strano le righe finiscono con gli stessi esadecimali CR e LF quindi non e' neppure un problema di file...