scrittura di una stringa con il suo valore su seriale

Ciao a tutti,
ho un problema con le stringhe sulla seriale.
Vorrei far interpretare ad arduino la scritta "cadenza 20" dove 20 sta per il valore di cadenza.
Questo l'ho temporaneamente risolto in due step. Ovvero:

  if (Serial.available())
  {
    String comando = Serial.readString();
    if (comando == "cadenza")
    {
      delay(4000);
      if (Serial.available())
      {
        String comando = Serial.readString();
        int stringaCadenza = 0;
        stringaCadenza = comando.toInt();
        cadenza = stringaCadenza * 1000;
        Serial.print(F("Cadenza aggiornata a: "));
        Serial.println(cadenza);
        eeprom_update_dword( ( unsigned long *) 8, cadenza);
      }
    }

Praticamente scrivo prima "cadenza" e poi scrivo il valore entro 4 secondi. Cosi' è molto scomodo.

So risolverlo con uno switch case tipo:

int lettura;
byte caratteri;
if (Serial.available())
  {
    byte command = Serial.read();
    switch (command)
    {
      case 'c':
        lettura = 0;
        tempMillis = millis();
        caratteri = 0;
        do {
          if (Serial.available()) {
            tempChar = Serial.read();
            caratteri++;
            if ((tempChar >= 48) && (tempChar <= 57)) {
              lettura = (lettura * 10) + (tempChar - 48);
            }
            if ((tempChar == 10) || (tempChar == 13)) {
              break;
            }
          }
        }

però il problema sta nel fatto che non voglio scrivere una lettera seguita dal valore ma mi piacerebbe scrivere tutta la parola...
alcune dritte??

Grazie mille!

ciao Gianky,

non sono un espertone di Stringhe ma farei così:

fai un trim() della Stringa che ricevi
farei un indexOf() nella Stringa che ricevi cercando "cadenza"
se non ritorna -1 vuol dire che hai trovato quello che cercavi
adesso usi remove() per eliminare dalla Stringa "cadenza"
usi un altro trim() per rimuovere eventuali spazzi
usi un toInt() per trasformare quello che rimane in Int....sempre che non ritorni errore...da gestire

e con questo spero di non aver sparato boiate...

Ciao orso,
grazie per aver risposto. Seguendo i tuoi consigli ho fatto questo:

int cadenza;
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  if (Serial.available())
  {
    String comando = Serial.readString();
    comando.trim();
    comando.indexOf(cadenza);
    comando.remove();
    comando.trim();
    comando.toInt();
    Serial.print("Comando: ");
    Serial.println(comando);
  }
}

però mi compila un errore alla riga 14 (comando.remove()) scrivendo:

no matching function for call to 'String::remove()'

Questo perchè il remove() accetta solo variabili di tipo unsigned int.
l'indexOf() accetta variabili char o string ma non capisco come usarlo, o meglio, non capisco quando ha trovato quello che dico o no..
in definitiva quello che dovrei fare è ricercare la parola 'cadenza' e cancellarla..ma cosi non si può fare.
Non riesco a capire come risolvere..

ciao...io pensavo ad una cosa del genere:

String a = "";

void setup() {
  Serial.begin(9600);

}

void loop() {
  if (Serial.available() > 0) {
    a = Serial.readString();
    a.trim();
  }
  if (a.indexOf("comando") > -1) {
    a.remove(0, 7);
    a.trim();
    int b = a.toInt();
    Serial.println(b);
  }
}

prova e fammi sapere

Grazie mille orso2001!!! +1 :slight_smile:
Ho adattato tutto il mio programma cosi...tutto funzionante tranne un piccolo problema su un comando. Non svuota il buffer e ripete sempre il comando come se lo scrivessi sempre...

Ho provato con la funzione Serial.flush() oppure ad assegnare il buffer in una variabile a perdere

ad esempio:

  else if (comando.indexOf("controllo") > -1)
  {
    Serial.flush();
    byte a = Serial.read(); //variabile a perdere

Ho provato pure a utilizzare il goto riportandomi ad inizio loop ma non risolvo nulla.
come posso risolvere?

ciao,

de nada...per il "problema" che hai adesso, per come l'hai detta, non saprei.
posta il codice che ci do un occhio.

ecco qui quanto richiesto:

String comando;
void setup(){}
void loop()
{
  hello:
}
  if (Serial.available() > 0)
  {
    comando = Serial.readString();
    comando.trim();
  }
else if (comando.indexOf("controllo") > -1)
  {
    Serial.flush();
    byte a = Serial.read();
    float minCad = float(cadenza) / 60;
    float minAcc = float(tempoAccensione) / 1000;
    gio = eeprom_read_word( (int *) 16);
    me = eeprom_read_word( (int *) 18);
    an = eeprom_read_word( (int *) 20);
    hoara = eeprom_read_word( (int*) 34);
    mina = eeprom_read_word( (int *) 38);
    statoElettrovalvola = digitalRead(elettroValvola);
    HCRTC.RTCRead(I2CDS1307Add);
    Serial.print(HCRTC.GetDateString());
    Serial.print(F(" - "));
    Serial.println(HCRTC.GetTimeString());
    Serial.print(F("Alba: "));
    Serial.println(tempoAlba);
    Serial.print(F("Tramonto: "));
    Serial.println(tempoTramonto);
    Serial.print(F("Mezzogiorno solare: "));
    Serial.println(tempoMezzogiornoSolare);
    Serial.println(F(""));
    Serial.print(F("il semenzaio "));
    if (statoElettrovalvola == HIGH)  Serial.println(F("sta irrigando"));
    else Serial.println(F("non sta irrigando"));
    Serial.print(F("Cadenza: "));
    Serial.print(cadenza);
    Serial.print(F(" sec. ("));
    Serial.print(minCad);
    Serial.println(F(" min)"));
    Serial.print(F("Tempo accensione: "));
    float tempoAccensioneFloat = float(tempoAccensione) / 1000;
    Serial.print(tempoAccensione);
    Serial.print(F(" sec. ("));
    Serial.print(minAcc);
    Serial.println(F(" min)"));
    Serial.println(F(""));
    Serial.print(F("ritardo alba: "));
    if (costanteOraAlba < 10)
    {
      Serial.print(F("0"));
      Serial.print(costanteOraAlba);
    }
    else Serial.print(costanteOraAlba);
    Serial.print(F(":"));
    if (costanteMinutiAlba < 10)
    {
      Serial.print(F("0"));
      Serial.println(costanteMinutiAlba);
    }
    else Serial.println(costanteMinutiAlba);
    Serial.print(F("anticipo tramonto: "));
    if (costanteOraTramonto < 10)
    {
      Serial.print(F("0"));
      Serial.print(costanteOraTramonto);
    }
    else Serial.print(costanteOraTramonto);
    Serial.print(F(":"));
    if (costanteMinutiTramonto < 10)
    {
      Serial.print(F("0"));
      Serial.println(costanteMinutiTramonto);
    }
    else Serial.println(costanteMinutiTramonto);
  goto hello;
  }
}

Come vedi, ho provato a risolvere il problema con Serial.flush() o una variabile byte a per scaricare il buffer, o ancora con il goto...ma niente. In definitiva posso risolvere con un overflow del watchdog però da utilizzare come extrema ratio...speriamo se ne esce fuori :smiley:

Non è tutto il codice..quello è di 400 righe e ci sono molte cose che non c'entrano nulla..comunque non ho problemi nel postarlo.

Non devi svuotare il buffer della seriale , che è già vuoto

nemmeno flussarla, la seriale, dato che non trasmetti, la Serial.flush() svuota il buffer di TRASMISSIONE

e nemmeno niente altro

semplicemente devi ricordarti di CANCELLARE la stringa ricevuta dopo che la hai processata

tu metti in ricezione la stringa solo se hai qualcosa nel buffer di ricezione

se non hai nulla nel buffer di ricezione, la stringa rimane semplicemente quella vecchia....

cancellala

PS

diventa sempre più difficile seguirti
non leggi la documntazione, salti di palo in frasca, cambi idea, ripensi, aggiungi cose che non centrano nulla,

esempio qui:
hai tagliato il codice che hai postato dicendo che il resto non centra

e poi dopo aver passato 5 minuti a leggere quello che hai postato scopro che non centra nulla nemmeno quello

ieri l'altro dicevi di aver postato un datasheet e ne avevi postato un'altro...
sei andato a leggere la documentazione dopo che te lo ho consigliato due volte

mah... sono perplesso

ORDINE e chiarezza mentale
sono i due ingredienti NECESSARI per ottenere risultati ripetibili

ORDINE e chiarezza mentale
sono i due ingredienti NECESSARI per ottenere risultati ripetibili

Sono fregato! :smiley:

ciao Gianky,

vedo che verifichi il contenuto della Stringa con:

else if (comando.indexOf("controllo") > -1)

però nel resto del listato che hai postato non vedo il remove() e, come detto da docsavage, non svuoti la Stringa...quindi una volta che in questa Stringa ci metti qualche cosa rimane tale e quale confermando ad ogni ciclo quell'else if...

Grazie mille degli aiuti..ho risolto :Di

come?....hai usato remove() o svuoti la Stringa...o altro?

Ho utilizzato semplicmente remove() :smiley: