comando serial.read come lo azzero

Ciao,non capisco in un pezzo di codice " recuperato dal Web " come faccio a pulire il serial.read dopo una richiesta di comando già avvenuta,in poche parole se faccio una richiesta del comando ??,mi rimane in "pancia" e se successivamente faccio un altro tipo di richiesta diverso ,mi risponde la prima volta come se avessi richiesto il comando ??.
Grazie

void Seriale_RTC() {
  
  // 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 == '

) { 
     
      //
      // Lista Comandi
      //
     
      // ??
      if(serial_buffer[0] == '?' && serial_buffer[1] == '?')
        Serial.println("Trasmissione OK");
       
      // ?V
      else if(serial_buffer[0] == '?' && serial_buffer[1] == 'V')
        Serial.println(VERSION);

// ?P
      else if(serial_buffer[0] == '?' && serial_buffer[1] == 'P') {       
        DateTime now = RTC.now();
        char time_string[20];
        sprintf(time_string, "%02d/%02d/%d %02d:%02d:%02d",
          now.day(), now.month(), now.year(),
          now.hour(), now.minute(), now.second());
          Serial.println(time_string);
      }

// ?R
      else if(serial_buffer[0] == '?' && serial_buffer[1] == '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");
      }
     
      // Reset the buffer
      buffer_position = 0;

}
   
    // 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++;     
    }
  }   
}

Dove azzeri buffer_position prova ad azzerare anche il buffer con

serial_buffer[0] = '\0';

No,purtroppo non funziona,non riesco a capire perchè gli rimane in " pancia " la stringa precedente..

ciao...dov'è che azzeri la variabile buffer_position ?

Non ho capito la tua domanda ... ::slight_smile:

... la Serial.read() legge un 'char' dal buffer interno della seriale e lo elimina, quindi una seconda chiamata alla Serial.read() NON può ritornare il vecchio carattere quindi ... spiega meglio cosa vuoi fare ed il punto esatto in cui ritieni di avere un problema.

Guglielmo

Ciao,ho provato così :

 // Reset the buffer
      buffer_position = 0;
      serial_buffer[0] = '\0';

è corretto oppure ho sbagliato ??

grazie

In quel modo pulisci SOLO l'elemento 0 di serial_buffer ... che, se lo leggessi come stringa classica del 'C' andrebbe bene, ma dato che tu leggi i caratteri singolarmente ... ti trovi dentro quello che ci avevi già scritto.

Se lo usi a carattere devi pulire tutti gli elementi che hai usato scrivendo con una "for" il valore 0x00 (equivalente di '\0') in essi.

Guglielmo

come dice Guglielmo od un ciclo for oppure con memset ...guarda QUESTO link

ORSO2001:
... oppure con memset ...guarda QUESTO link

... che è sicuramente più veloce :wink:

Guglielmo

…utilizzo il ciclo for,ma non mi funziona,dove sbaglio ?

 // Reset the buffer
      buffer_position = 0;
      for ( serial_buffer [buffer_position];serial_buffer < serial_buffer[BUFFER_SIZE] ;serial_position++ ) { 
      	serial_buffer[] = 0x00;
      	delay(10);
      }

Grazie

Sbagli proprio il FOR !!!

for (buffer_position = 0; buffer_position < BUFFER_SIZE; buffer_position++) serial_buffer[buffer_position] = 0x00;

Guglielmo

… ma, come ti è stato detto, ancora meglio e più veloce:

memset(serial_buffer, 0x00, BUFFER_SIZE);

Guglielmo

P.S.: In entrambi i casi … sempre che BUFFER_SIZE sia la dimensione esatta di serial_buffer … ::slight_smile:

grazie delle dritte,ma non con la funzione memset si comporta sempre nella stessa maniera,allego il codice con le modifiche :

#define BUFFER_SIZE 30
#define VERSION     "RTC / 1.0"
char serial_buffer[BUFFER_SIZE];
int buffer_position;


void 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 == '

) { 
     
      //
      // Lista Comandi
      //
     
      // ??
      if(serial_buffer[0] == ‘?’ && serial_buffer[1] == ‘?’)
        Serial.println(“Trasmissione OK”);
       
      // ?V
      else if(serial_buffer[0] == ‘?’ && serial_buffer[1] == ‘V’)
        Serial.println(VERSION);

// ?P
      else if(serial_buffer[0] == ‘?’ && serial_buffer[1] == ‘P’) {       
        DateTime now = RTC.now();
        char time_string[20];
        sprintf(time_string, “%02d/%02d/%d %02d:%02d:%02d”,
          now.day(), now.month(), now.year(),
          now.hour(), now.minute(), now.second());
          Serial.println(time_string);
      }

// ?R
      else if(serial_buffer[0] == ‘?’ && serial_buffer[1] == ‘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”);
      }
     
      // Reset the buffer
      buffer_position = 0;
      memset(serial_buffer, 0x00, BUFFER_SIZE);
      //for (buffer_position = 0; buffer_position < BUFFER_SIZE; buffer_position++) serial_buffer[buffer_position] = 0x00;
    }
   
    // Carriage return, do nothing
    else if(incoming_char == ‘\r’); // ‘\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++;     
    }
  }   
}

sei sicuro!?...a me, cos'ì com'è, togliendo il controllo dell'RTC, funziona!

cioè se invio ??$ e dopo ?R$ e dopo ?P$...e mescolandole da sempre la cosa giusta.

EDIT: per mescolare intendo in ordine sparso tra loro

grazie dell'aiuto,ma tu lo stai simulando con il monitor seriale o un terminale esterno ??

monitor seriale...che differenza fa?...sempre un byte (di solito char) alla volta leggi con la Serial.read()...oppurre devi usare altri metodi.

…mi sa che cè qualcosa di strano quando uso il Terminale Esterno,adesso sto provando i parametri dal Monitor Seriale dell 'IDE è funziona correttamente,magari ho sbagliato qualche settaggio,ti faccio sapere.

Grazie

cosa intendi per "terminale esterno"?...hai fatto uno sketch per il trasmettitore?

si intendo che uso questo "Terminal " ,setto le macros in base ai comandi che scrivo nel codice .
Adesso gli do un occhio...

Grazie dell'aiuto a tutti,funziona correttamente,non avevo aggiornato le macros del terminale con le ultime modifiche della stringa al posto di scivere " ?V$ " avevo scritto " $?V " ,forse per quello mi eseguiva il comando la seconda volta..credo

Grazie a Tutti