Interrompere parte del ciclo loop()

Salve a tutti!

Io vorrei interrompere parte del ciclo loop per non perdere tempo nel fare operazioni inutili.

Mi spiego meglio: nel ciclo loop ci sono diversi comandi che mando in input dal monitor seriale. Ce n'è uno in particolare che richiede tempi molto piccoli (27ms) per funzionare, quindi ho bisogno che se mando quel comando, ignori tutto il resto del loop e si concentri su quel comando e basta. Non so se mi sono spiegata bene...

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

void loop(){
String stringOne = "";

  if (Serial.available()){ 
      while (Serial.available()>0){ 
      char a = Serial.read();            // Stores current byte
      stringOne += String(a);            // Append current Byte to message String
      delay(10);
    }


altri comandi....


while (stringOne == "ST"){
                do something....;
}

}

Per me non è molto chiaro.
Comunque una soluzione è avere il codice condizionato, dentro ad if
Variabile booleana, vero/falso che tu piloti, con if booleana == vero fai comando, altrimenti non fai

No non devo seguirla una sola volta, devo eseguirla ogni 27ms, ignorando il resto
Cioè una volta che entra nel loop voglio che vada direttamente a quel comando, senza farlo passare da tutto il resto... Oddio non so come spiegarmi meglio...

Allora tutto il resto è condizionato, se vero la booleana fai solo quel comando, saltando il resto.
Non sò però come e quando vuoi mettere a vero la booleana per far scattare quel comando

Forse se posti il programma per intero riusciamo a capire meglio. E se spieghi cosa deve fare il programma.
Soprattutto non capisco il perchè se invia dati con quel comando non deve fare "il resto".

Capisci che a domanda "generica" come da titolo, possiamo rispondere solo in maniera generica, se invece entri nei dettagli allora possiamo essere più specifici.

Quoto @nid69ita

Quello che chiedi pare ad intuito essere la selezione di porzioni di codice da eseguire nel loop. Una soluzione è il comando switch.

Un prototipo di switch è il seguente:

byte nCase = 0;

void loop() {
 
    switch (nCase) {
        case 0:
            // tuo codice case 0
            break;
        case 1:
           // tuo codice
           break;
       case 2:
           // tuo codice
           break;
   }

}

Ci sono tre porzioni di codice, ognuna è selezionata tramite il valore che assume la variabile nCase che inizialmente vale
zero pertanto verrà eseguito // tuo codice case 0, all'interno di questo quando lo ritieni opportuno assegni alla variabile
nCase il valore 1 o 2 e al prossimo ciclo verrà eseguito il case selezionato.

Ciao.

Purtroppo non posso postare tutto il codice...

Dovrei usare degli interrupt, da quel che mi ha detto il prof...

fedeaero:
Purtroppo non posso postare tutto il codice...

:o :o :o Scusa? Non capisco ... ::slight_smile:

Stai utilizzando software OpenSource, Hardware OpenSource, un comunità che aiuta l'OpenSource e non puoi postare il codice?

Spiegati meglio o difficilmente avrai altri aiuti ...

Guglielmo

È un lavoro di tesi quindi non sono autorizzata a postare il codice, per questo non posso

Trova un modo per postare del codice che si comporta come il tuo della tesi, mi spiego meglio scrivi un altro scketch, cambia il nome delle variabili, così non ci sono problemi.

Domanda: Il comando che invi tramite seriale da pc verso arduino deve per forza essere una stringa o può bastare un byte 0÷255?

No so in che modo ti possa fornire aiuto. Interrupt? si o anche no, più no che si, solitamente un interrupt intercetta un eventoe lo lega ad una porzione di codice detta ISR "Interrupt Service Request" e non mi sembra il tuo caso.

Comunque dai uno sguardo a questo link

Invio dei byte su seriale da PC verso arduino e li uso come comandi.

Ciao
Mi sembra che ti stia ponendo il problema opposto: non devi saltare il resto del loop, ma eseguire periodicamente la funzione che ti serve! Usa millis(): con unsigned long t,

if(millis()-t>=PERIODO) {t=millis(); fai_questo();}

Oppure, quando deve fare quella cosa salta a una funzione che la fa e non ne esce finché non l'ha finita. Puoi usare un interrupt per impostare una variabile volatile che, rilevata poco dopo nel loop, fa saltare alla funzione quando si verifica un evento.

Thread chiuso ...
... prima di tutto, vedo che l'OP NON si è mai presentato (come richiesto da REGOLAMENTO), ma, cosa ben più grave (per cui chiudo), aveva già iniziato la discussione nella sezione di lingua inglese, dove la stanno aiutando e ... il cross-posting è proibito dal regolamento (anche in sezioni di lingua diversa).

Guglielmo