Non capisco dove sbaglio..

Datman:
poi c'è una graffa che non capisco che cosa chiuda...

Eh già, quello e non solo. :wink:

maubarzi:
Mi sono messo ad indentare e mi pare corretto, quello che ho rilevato è un ; dove non ci dovrebbe stare, verso la fine.
Però forse mi sfugge a me un dettaglio della sintassi del C, perchè il compilatore pare me lo accetti... ignoranza mia probabilmente.

No, se il compilatore lo accetta non è sbagliata la sintassi, ma sappiamo tutti bene che non basta che un codice compili senza errori per affermare che funzioni correttamente :wink: Quello che sospetto è che l'"incastro" di tutte quelle if() che sembrano la statua di Laocoonte possano SEMBRARE corrette. O fa le cose che ho consigliato prima (e quindi verificare che il flusso corrisponda a quanto da lui atteso) oppure, come ho detto, metterci noi a fare indentazione e debug ovvero ciò che dovrebbe fare lui (e che faccio anche io nei miei codici quando qualcosa non va) mi pare un poco eccessivo. :smiley:

Alludi al codice postato nel primo post o nel secondo? io ho guardato il secondo.

Al secondo, visto che ha detto che il primo era errato.

No, è giusto: è la fine dell'if incoming. Da una prima occhiata con la formattazione automatica, le parentesi sembrano corrette.

La graffa misteriosa chiude questo:

if(incoming_char == '

e poi ci sono delle else if legate sempre a questo.

Scusa, @docdoc, se ti faccio la domanda diretta, ma tu hai visto un errore nella nidificazione oppure hai fatto il discorso, giustissimo, per portare ordine, come prerequisito a tutto il resto?

Perchè se hai visto un effettivo errore nel nido di vespe, ok, altrimenti io inviterei l'op a riverificare meglio l'errore che gli esce in modo da essere sicuro di quello che ha visto, perchè secondo me si sta focalizzando sull'errore sbagliato.

Per l'errore di sintatti, io avevo visto questo:

else if(incoming_char == '\r');

Però ho il fondato sospetto che il ; venga considerato come istruzione "vuota" valida.
Quindi sarebbe equivalente a scrivere:

else if(incoming_char == '\r') {
}

Visto che poi c'è un "else", se si toglie il ; scatta l'errore di compilazione...
) {


e poi ci sono delle else if legate sempre a questo.

Scusa, @docdoc, se ti faccio la domanda diretta, ma tu hai visto un errore nella nidificazione oppure hai fatto il discorso, giustissimo, per portare ordine, come prerequisito a tutto il resto?

Perchè se hai visto un effettivo errore nel nido di vespe, ok, altrimenti io inviterei l'op a riverificare meglio l'errore che gli esce in modo da essere sicuro di quello che ha visto, perchè secondo me si sta focalizzando sull'errore sbagliato.

Per l'errore di sintatti, io avevo visto questo:

§DISCOURSE_HOISTED_CODE_1§


Però ho il fondato sospetto che il ; venga considerato come istruzione "vuota" valida.
Quindi sarebbe equivalente a scrivere:

§DISCOURSE_HOISTED_CODE_2§


Visto che poi c'è un "else", se si toglie il ; scatta l'errore di compilazione...

m'intrometto...premettendo che non ho capito se per la richiesta specifica, quello del ?P, il problema (risultato finale) non stampi, stampi qualche cosa di "inatteso"...altro!?...do le mie opzioni:

  • annidamento non correto (detto e ridetto di controllare) e quindi non ci si entra proprio...un bel Serial.println("sono qui"); messo come prima istruzione toglierebbe ogni dubbio.

  • si entra nell'else if ma non vengono eseguite le istruzioni ( per esempio non si controlla se la sprintf ritorna un valore negativo)...quindi un bell'if che lo verifichi e stampi un "problemi con sprintf".

A me tutta la struttura sembra corretta, ma in questi casi si procede per step

  • aggiungi tutte le graffe dove mancano nella struttura if-else if, (abilita raggruppamento codice nelle impostazioni dell'ide, in questi casi aiuta a leggere)

  • visto che hai dei serial.print ovunque, se mandi un [ ?P ] cosa stampa?

  • chiudi sempre una struttura if-else if con un else finale che raccoglie tutto il resto, aiuta molto nel debug

Federico

Inanzitutto,ringrazio in anticipo per chi mi stando delle dritte o altro,onestamente non sono il tipo che cerca di farsi fare il codice o il debug da altri,anzi,quando ci sono queste problematiche,e le riesco a trovare io ,magari anche con qualche dritta da + esperti," godo come un riccio"...
Adesso cercherò,di prendere spunto dai consigli per venirne a capo.
L'unico dubbio che mi è sempre venuto,ma se tutti i comandi funzionano sempre,e quando inserisco il comando ?h,non mi funziona solo il comando ?P,mi sono "impuntato" a solo questo pezzo di codice aggiunto,non pensando ai vari else if...ecc che non mi hanno mai dato problemi
Adesso inizio a "smanettare"...
Grazie

Io, visto che ci DEVE mettere le mani, tutta quella parte la sistemavo con uno switch/case ... così, un domani, aggiunge anche altri comandi in modo semplice ...

if (serial_buffer[0] == '?') {
   switch (serial_buffer[1]) {
      case '?':
         // metti qui quello che deve fare
         //
         break;
      case 'V':
         // metti qui quello che deve fare
         //
         break;
      case 'P':
         // metti qui quello che deve fare
         //
         break;
      ...
      ...
      ...
      default:
         // metti qui quello che deve fare
         //
         break;
   }
}

... pulito, leggibile ed efficiente :slight_smile:

Guglielmo

Concorquoto

gpb01:
Io, visto che ci DEVE mettere le mani, tutta quella parte la sistemavo con uno switch/case ... così, un domani, aggiunge anche altri comandi in modo semplice ...

Quoto e concordo

Ah, ecco, mi chiedevo come mai ancora non l'avesse suggerito nessuno, poi sono arrivato al post di Guglielmo.

zoomx:
Ah, ecco, mi chiedevo come mai ancora non l'avesse suggerito nessuno, poi sono arrivato al post di Guglielmo.

In realtà era già stato suggerito :slight_smile:

docdoc:
... oppure direttamente una istruzione "switch"...

E' vero!

docdoc:
Hai troppi "else if" in cascata senza una indentazione decente e questo ti fa perdere di vista qualche "else" a quale "if" corrisponda.

Nota stilistica: a questo aggiungo che bisognerebbe cercare di tenere le strutture (if, while, for) brevi, in modo da vedere inizio e fine nella stessa schermata (dicono meno di dieci righe, ma non siamo così draconiani). Un if annidato oltre i due livelli, e lungo diverse "pagine" porta facilmente ad errori (e scoraggia la lettura :))

gpb01:
Io, visto che ci DEVE mettere le mani, tutta quella parte la sistemavo con uno switch/case ... così, un domani, aggiunge anche altri comandi in modo semplice ...

Come non essere d'accordo, e personalmente avrei anche messo solo chiamate a funzioni specifiche comando per comando.
Giusto perchè condivido pure questo (esteso anche agli switch/case):

Claudio_FF:
Nota stilistica: a questo aggiungo che bisognerebbe cercare di tenere le strutture (if, while, for) brevi, in modo da vedere inizio e fine nella stessa schermata (dicono meno di dieci righe, ma non siamo così draconiani). Un if annidato oltre i due livelli, e lungo diverse "pagine" porta facilmente ad errori (e scoraggia la lettura :))

Però, secondo me, il problema è altrove ...ove ...ove ...

Ciao,allora ho iniziato a "smanettare" il codice seguendo i vari consigli ,allego il nuovo codice.
Il problema/errore ," tagliando e cucendo ",si trova nel comando ?h ,dove ho scritto :
//Serial.print (value); < ----- riga problema
Forse perchè ho impostato la variabile value tipo byte ??

//
// Gestione Parametri Seriale Funzione RTC
//

void RTC_Seriale () {

  // Wait for incoming data on serial port
  if (Serial.available() > 0) {

    // Read the incoming character
    char incoming_char = Serial.read();
    
    // End of line?
    if(incoming_char == '

) { 
    if (serial_buffer[0] == '?') {
    switch (serial_buffer[1]) {

// ------------------------------------------------------------------------------
      //
      // Elenco Comandi Utilizzati  : [ ?? ] Richiesta Trasmissione TxRx
      // "                          : [ ?V ] Read  Versione Firmware
      // "                          : [ ?P ] Read  Giorno / Data / Ora                   
      // "                          : [ ?R ] Write Giorno / Data / Ora
      // "                          : [ ?H ] Write Fasce Orarie On / Off Relè
      //_______________________________________________________________________________
      //
      // "                          : [ ?h ] Read  Fasce Orarie On / Off Relè
      // "                          : [ ?r ] Read  Variabili Ora Legale / Solare
      // "                          : [ ?w ] Write Variabili Ora Legale / Solare
      //
      // ------------------------------------------------------------------------------

//
      // Inizio Comandi Utilizzati
      //

//
      // Comando [ ?? ]
      //

case '?': {
      Serial.println("Trasmissione OK");
      break;
      }

//
      // Comando [ ?V ]
      //

case 'V': {
      Serial.println(VERSION);
      break;
      }

//
      // Comando [ ?P ]
      //

case 'P': {     
      DateTime now = RTC.now();
      char time_string[20];
      sprintf(time_string, "Giorno [ %01d ] Data [ %02d/%02d/%d ] Ora [ %02d:%02d:%02d ]",
      now.dayOfTheWeek(),
      now.day(), now.month(), now.year(),
      now.hour(), now.minute(), now.second());
      Serial.println(time_string);
      break;
      }

//
      // Comando [ ?R ]
      //

case 'R': {   
      String time_string = String(serial_buffer);
      int day = time_string.substring(2, 4).toInt();
      int month = time_string.substring(4, 6).toInt();       
      int year = time_string.substring(6, 10).toInt();
      int hour = time_string.substring(10, 12).toInt();
      int minute = time_string.substring(12, 14).toInt();
      int second = time_string.substring(14, 16).toInt();
      RTC.adjust(DateTime(year, month, day, hour, minute, second));
      Serial.println("RTC Rifasato");
      break;
      }

//
      // Comando [ ?H ]
      //

case 'H': {   
      String time_string = String(serial_buffer);
      int hour_on = time_string.substring(2, 4).toInt();
      int minute_on = time_string.substring(4, 6).toInt();       
      int hour_off = time_string.substring(6, 8).toInt();
      int minute_off = time_string.substring(8, 10).toInt();
      address = 5;
      value = hour_on ;
      EEPROM.write(address, value);
      address = 6;
      value = minute_on ;
      EEPROM.write(address, value);
      address = 7;
      value = hour_off ;
      EEPROM.write(address, value);
      address = 8;
      value = minute_off ;
      EEPROM.write(address, value);
      Serial.println("Impostata Selezione Oraria");
      break;
      }

//
      // Comando [ ?h ]
      //

case 'h': { 
      address = 5;
      value = EEPROM.read(address);
      Serial.print ("Ora    di Start On  : ");
      //Serial.print (value); < ----- riga problema
      Serial.println (" ");
      address = 6;
      value = EEPROM.read(address);
      Serial.print ("Minuti di Start On  : ");
      //Serial.print (value); < ----- riga problema
      Serial.println (" ");
      address = 7;
      value = EEPROM.read(address);
      Serial.print ("Ora    di Stop  Off : ");
      //Serial.print (value); < ----- riga problema
      Serial.println (" ");
      address = 8;
      value = EEPROM.read(address);
      Serial.print ("Minuti di Stop  Off : ");
      //Serial.print (value); < ----- riga problema
      Serial.println (" ");
      Serial.println("Parametri Selezione Fasce On / Off impostati");
      break;
      }

//
      // Comando [ ?r ]
      //

case 'r': {
      for (int address = 0; address <= 4; address++) {
      value = EEPROM.read(address);
      Serial.print(F("Step\t = \t"));
      Serial.print( char('a'+address) );
      Serial.print(F("\t ; \t Valore \t = \t"));
      Serial.println(value, DEC);
      delay(100);
      if (address == 4) {
      address = 0;
      Serial.println();
      break;
      }
      }
      break;
      }

//   
// Comando [ ?w ]
//

case 'w': {
String time_string = String(serial_buffer);
int attendiS31 = time_string.substring(2, 3).toInt();
int attendiSdom = time_string.substring(3, 4).toInt();       
int attendiL31 = time_string.substring(4, 5).toInt();
int attendiLdom = time_string.substring(5, 6).toInt();
int read_write = time_string.substring(6, 7).toInt();
address = 0;
value = attendiS31 ;
EEPROM.write(address, value);
address = 1;
value = attendiSdom ;
EEPROM.write(address, value);
address = 2;
value = attendiL31 ;
EEPROM.write(address, value);
address = 3;
value = attendiSdom ;
EEPROM.write(address, value);
address = 4;
value = read_write ;
EEPROM.write(address, value);
Serial.println("Variabili L/S Rifasate");
break;
}
}
}

//
//  Fine Comandi Utilizzati
//

// Reset the buffer
      buffer_position = 0;
      memset(serial_buffer, 0x00, BUFFER_SIZE);
  }

// Carriage return, do nothing
    else if(incoming_char == '\r');
   
    // Normal character
    else {

// Buffer full, we need to reset it
      if(buffer_position == BUFFER_SIZE - 1) buffer_position = 0;

// Store the character in the buffer and move the index
      serial_buffer[buffer_position] = incoming_char;
      buffer_position++;     
  }
}   
}

Ma quale errore ti da?

Onestamente quando inserisco la/e righe [ Serial.print (value); ] al comando ?P ,non ricevo nessuna risposta,quando invece le eliminano ,tutto funziona correttamente per quanto riguarda il comando ?P ,ricevo la risposta che mi aspetto.

Scusa ma sono duro.
La versione che hai postato qui sopra funziona, ma se scommenti una o tutte e 4 le Serial.print (value); non funziona più?
Ma non funziona più da subito oppure da dopo che hai lanciato il comando h?
E non funziona più solo il comando P?

Serial.print ( value, DEC );

maubarzi:
Scusa, @docdoc, se ti faccio la domanda diretta, ma tu hai visto un errore nella nidificazione oppure hai fatto il discorso, giustissimo, per portare ordine, come prerequisito a tutto il resto?

La seconda che hai detto :slight_smile:

D'altronde lo avevo scritto un paio di volte, sicuramente non sono stato abbastanza chiaro, mi auto-quoto:

Hai troppi "else if" in cascata senza una indentazione decente e questo ti fa perdere di vista qualche "else" a quale "if" corrisponda.

Sinceramente dovermi mettere io a riformattargli il codice e quindi vedere cove sia l'inghippo non mi va molto, se va all'OP è meglio per noi (perché evitiamo un mal di testa) ma anche per lui (perché impara come si fa debug :wink: ).

Quindi no, non ho analizzato il codice perché non avevo sottomano un Moment Act :smiley: e comunque se si introduce una if() e non funziona più qualche altra, significa in genere che è stata messa "nel posto sbagliato"... :wink: