Buffer riceezione da seriale

Buongiorno ragazzi,
era un po’ che ci lavoravo e finalmente con il tempo ci sono riuscito. Volevo realizzare un pezzo di codice per ricevere sulla seriale delle istruzioni da far eseguire ad arduino. L’obbiettivo è di classificare le istruzioni ricevute in ordine di priorità (priorità assegnate secondo le mie esigenze sul primo char ricevuto) in una memoria (String memoriaPriorita_2[numeroMaxStringhePerArrayMemoria]={}). Dopo aver ricevuto le istruzioni, arduino, deve iniziare ad eseguire le operazioni in basse alle priorità.
Esempio: se arduino riceve le seguenti istruzioni

  • accendi caldaia;
  • accendi luce xxx;
  • leggi temperatura;
  • spegni luce yyy;

le istruzioni da eseguire in ordine devono essere:

  • accendi luce xxx;
  • spegni luce yyy;
  • leggi temperatura;
  • accendi caldaia;

Posto il codice del serial event che ho scritto. Attualmente funziona tutto perfettamente, nel loop poi vado a vedere cosa c’è nelle varie memorie e esegue le istruzioni. Le priorità di lettura della memoria è gestita con dei millis().

void serialEvent(){
  int a=1;
  int b=1;
  int c=1;
  int d=1; 
  if(index==1){ //se index va a 1 significa che ho in iziato a leggere qualcosa sul buffer seriale, quindi abilito ilo timeout.
    tempoPerControlloComunicazioneDaSeriale=millis();
    abilitaTmrOutComunicazione =true;
  }
  if((millis() - tempoPerControlloComunicazioneDaSeriale > timeout) && (abilitaTmrOutComunicazione ==true) && (index != n_elementi_stringa-1)){
    abilitaTmrOutComunicazione = false;
    index=0;
    Serial.println("Arduino TimeOut Comunicazione Lettura Seriale"); // se non riceve in tempo tutti i 19 caratteri vado in time out. Tempo settato a 400 ms
  }
  if(Serial.available()>0){
    char ch=Serial.read();
    if((ch != NULL) && (ch != (char)' ')){ // se il carattere ricevuto è diverso da NULL o da vuoto vado avanti con la seguenza di lettura.
      stringaArrivo[index]=ch;             // se ricevo prima dei 19 caratteri un NULL o uno vuoto eseguo la procedura di errore.
      ch_error=0;
      index++;
    }
    else{
      ch_error=ch_error + 1;      // se nella stringa ricevuta ci sono crattrei NULL o vuoti vado in allarme
      abilitaArduinoInErrore=true;
      index=0;
    }
    if(index==n_elementi_stringa-1){     //la priorità di esecuzione è aseegnata in base al primo carattere lette
      abilitaTmrOutComunicazione = false;
      if(((char)stringaArrivo[0] == '1')){
        abilitaPrioritaAssoluta =true;
          enbleAnalizzaMemoria_2=false;
           enbleAnalizzaMemoria_3=false;
            enbleAnalizzaMemoria_4=false;
             enbleAnalizzaMemoria_5=false;
      }
      else{
        switch((char)stringaArrivo[0]){
          case '2':
          while(memoriaPriorita_2[a] != (char)NULL){  // essendo la memoria un array di stringhe prima di memorizzare la stringa ricevuta sulla seriale. 
          a++;                                        // vado a trovare nell'array l'elento vuoto
        }
        memoriaPriorita_2[a]=(String)stringaArrivo;
         enbleAnalizzaMemoria_2=true;
         abilitaTempoIterupMemoria=true;
        break;
        case '3':
          while(memoriaPriorita_3[b] != (char)NULL){
          b++;
        }
        memoriaPriorita_3[b]=(String)stringaArrivo;
        enbleAnalizzaMemoria_3=true;
        abilitaTempoIterupMemoria=true;
        break;
        case '4':
          while(memoriaPriorita_4[c] != (char)NULL){
          c++;
        }
        memoriaPriorita_4[c]=(String)stringaArrivo;
        enbleAnalizzaMemoria_4=true;
        abilitaTempoIterupMemoria=true;
        break;
        case '5':
          while(memoriaPriorita_5[d] != (char)NULL){
          d++;
        }
        memoriaPriorita_5[d]=(String)stringaArrivo;
        enbleAnalizzaMemoria_5=true;
        abilitaTempoIterupMemoria=true;
        break;        
        }
      }      
    }
  }
  if(index== n_elementi_stringa){        // se ricevo tutti i 19 elementi azzero index per essere pronto a ricevere una nuova stringa
    index=0;
    ch_error= 0;
  }
  if((abilitaTmrOutComunicazione ==true) && (index <19) && (ch_error==1) && (abilitaArduinoInErrore==true)){
    Serial.println("Arduino Errore Comunicazione Lettura Da Seriale");    // se rivevo vuoti prima dei 19 caratteri, stampo il messaggio di errore
    abilitaArduinoInErrore=false;
  }
}

Il codice non è molto commentato, ma credo che si capisce.
La mia domanda è la seguente: secondo voi c’è qualche modo per poter fare quello che voglio io scrivendo meno righe di codice? In sostanza può essere sintetizzato questo codice?
Ho l’impressione che nonostante funziona, mi sono perso a scrivere righe di codice che non servono a nulla e che rallentano l’esecuzione del programma.

Grazie in anticipo per dei suggerimenti

pensate che questa è la miglior soluzione? ok.

Ma invece di tenere 4/5 stringhe di char perché non ti fai un unico array in cui ordini i compiti in base alla priorità man mano che ti arrivano dalla seriale?
Così non dovei fare altro che leggere sempre il compito nella prima cella dell’array, che è il compito con la priorità più alta al momento presente nel buffer, evitando quindi di tenerti anche 5 variabili per vedere se hai dei compiti con priorità “n” da eseguire.

Esempio:
arriva compito3, lo metti nel buffer.
Buffer:
compito3

arriva compito2, lo metti nel buffer.
Buffer:
compito2
compito3

Esegui il primo compito, che è compito2 e lo togli dal buffer.
Buffer:
compito3

Arriva compito1 e poi compito4, li metti nel buffer.
Buffer:
compito1
compito3
compito4

ecc…