[Risolto]Impostare attesa su Serial.available()

Ciao a tutti come da titolo ma mia domanda è, c'è possibilità di impostare un tempo massimo di attesa per il serial.available?

Ho visto il Serial.setTimeout(), ma da quello che ho capito non è applicabile al available. Il mio scopo è questo, ho scritto una piccola funzione per la connessione di "arduino due" con "raspberry" tramite seriale, dopo che la connessione è attiva la seriale resta in attesa di ricevere dati, quindi vorrei effettuare un controllo del tipo non ricevo dati da 5 minuti forse la connessione non è più attiva quindi faccio ripartire la funzione di connessione, oppure esiste una funzione predefinita che controlli se la seriale è connessa o no?

Grazie

Non non c'è una funziona già fatta, ma con l'ausilio di millis() ci metti un attimo ad implementarla ... ... prima di entrare nel ciclo di attesa leggi millis() e, nel ciclo di attesa fai la solita comparazione; se il tempo previsto è passato hai una condizione di "timeout" e quindi esci dal ciclo di attesa.

Guglielmo

gpb01: Non non c'è una funziona già fatta, ma con l'ausilio di millis() ci metti un attimo ad implementarla ... ... prima di entrare nel ciclo di attesa leggi millis() e, nel ciclo di attesa fai la solita comparazione; se il tempo previsto è passato hai una condizione di "timeout" e quindi esci dal ciclo di attesa.

Guglielmo

Scusa avevo pensato a millis(), però non capisco come implementarla, in quanto tutto quello che c'è dopo "if (Serial.available())" non viene letto fino a che non arriva qualcosa dalla seriale.

Praticamente io sono in questa situazione

char tokenTx[9] = "c3d1e@9="; //Invio Id verso python
boolean stato_connessione = false; // byte di controllo per la funzione connessione

void setup() {
  Serial.begin(115200);
}

void _connect(){
  stato_connessione = connessione(tokenTx);
}

void loop() {
  
  if (!stato_connessione){
    _connect();
  }
    
    if (Serial.available()){
      /* le righe successive sono delle prove*/
      char data = Serial.read();
      String test;
      test += data;
      Serial.print(test);
      if (data == '\n'){
        Serial.println("");
        stato_connessione = false;

Nel setup() salvi la prima volta millis() nella variabile d'appoggio; ricarichi detta variabile solo variabile DENTRO il "if (Serial.available())" mentre il test lo fai al di fuori.

Se non entri mai nel IF ... avrai un timeout dopo X secondi, se ci entri, il conteggio riparte dal momento in cui ci sei entrato.

Guglielmo

gpb01: Nel setup() salvi la prima volta millis() nella variabile d'appoggio; ricarichi detta variabile solo variabile DENTRO il "if (Serial.available())" mentre il test lo fai al di fuori.

Se non entri mai nel IF ... avrai un timeout dopo X secondi, se ci entri, il conteggio riparte dal momento in cui ci sei entrato.

Guglielmo

Scusa potresti spiegarmi meglio, ho fatto delle prove ma non riesco a venirne a capo, nel setup ho messo

currentMillis=millis();

prima dell'if ho messo

previusMillis=0;

if ((currentMillis - previusMillis) > 5000);{ _connect();}

poi nell' if (Serial.available()){ currentMillis;}

Grazie

Giusto per farti capire, la logica dovrebbe più o meno essere questa ... a te svilupparla bene ...

#define TIMEOUT 60000 // Un minuto = 60000 millisecondi

unsigned long saveMillis;
...
...
void setup() {
  ...
  ...
  saveMillis = millis(); 
}

...
...
...

void loop() {
   ...
   ...
   if (millis() - saveMillis > TIMEOUT) {
      ...
      // qui fai quello che devi fare per timeout
      ...
      saveMillis() = millis();   // e ripristini il conteggio per la prossima volta
   }
    
   if (Serial.available()){
      saveMillis() = millis();   // Qui, dato che hai ricevuto qualche cosa, resetti il tempo per il timeout
      ...
      ...
      ...
      ...
   }
   ...
   ...
}

Guglielmo

Grazie mille ho risolto con le tue indicazioni

Ottimo ! Buona prosecuzione ... :)

Guglielmo