Stringa di testo da array di byte

Buonasera a tutti,

credo di essermi bloccato su un problema semplice, ma da cui non ne vengo a capo.

Il mio problema è il seguente: tramite ingresso MIDI (su TX) ricevo una serie di byte, ciascuno dei quali rappresenta una lettera. Questa serie di byte la stampo su un display LCD per visualizzarla. Questa la parte di codice che utilizzo (utilizzo la porta seriale invece che il display per comodità, ma il concetto è lo stesso).

void LCDsysExMessagge(byte* a, unsigned sizeofsysex) { 
  for (int n = 6; n < 22; n++) {
    Serial.write(a[n]);
  }
  for (int n = 22; n < 38; n++) {
    Serial.write(a[n]);
  }
}

Fino a qui tutto bene, i byte vengono stampati correttamente già convertiti in codice ASCII.

Ora, quello che io vorrei fare, invece che stampare le lettere, è di salvare le lettere in una variabile di testo, in modo che la possa richiamare quando voglio, anche in momenti diversi rispetto a quanto viene ricevuto il segnale MIDI.

Nella mia testa avrei immaginato di prendere ogni byte, convertirlo in lettera, e salvare il tutto come una stringa di testo. Solo che non riesco a capire come concretizzarlo.

Qualcuno riesce a illuminarmi?
Grazie!

samsos90:
Fino a qui tutto bene, i byte vengono stampati correttamente già convertiti in codice ASCII

È qui l'inghippo. Non c'è nessuna conversione. Quei byte sono già i codici ASCII dei caratteri, perché i caratteri in se stessi non esistono. Quindi l'array 'a' è già la stringa, che eventualmente si può copiare in un altro array, magari aggiungendo il terminatore zero binario finale '\0' in modo da ottenere una stringa C completa.

In effetti cercavo di risolvere il problema nel modo sbagliato.
Non sapevo come memorizzare i byte in un array, e ho optato per una soluzione di questo tipo:

void LCDsysExMessagge(byte* a, unsigned sizeofsysex) { 
  if (a[3] == 1) { 
    i = 0;
    for (int n = 6; n < 22; n++) {
      LCD_V01[i] = a[n]; 
      i = i + 1;
    }
    i = 0;
    for (int n = 22; n < 38; n++) {
      LCD_V02[i] = a[n]; 
      i = i + 1;
    }
  }

e per stampare la stringa quando voglio uso questo semplice codice:

  for (int i = 0; i < 16; i++) {
    Serial.write(LCD_V01[i]);
  }
  Serial.print(" - ");
  for (int i = 0; i < 16; i++) {
    Serial.write(LCD_V02[i]);
  }

Ci sono magari soluzioni più efficienti per farlo?

Non mi è chiaro il perchè dello zero binario finale, che utilità ha?

Grazie per l'aiuto!

Il terminatore permette alle funzioni di stringa del C di riconoscere la fine di una stringa.

Le operazioni che hai scritto si possono scrivere anche così:

if (a[2] == 1) {
    memmove(LCD_V01, a+6, 16);
    LCD_V01[16] = 0;
    memmove(LCD_V02, a+22, 16);
    LCD_V02[16] = 0;
}
Serial.print(LCD_V01);
Serial.print(" - ");
Serial.print(LCD_V02);

Si può usare la print "standard" perché alle stringhe LCD_V0x è stato aggiunto il diciassettesimo carattere terminatore (che ovviamente non viene stampato, serve solo per capire dove finisce la stringa).

Non conoscevo il comando memmove che mi pare molto interessante.
Se ho capito bene dovrebbe funzionare così:

memmove(nome array di destinazione, punto di partenza dell'array da leggere, lunghezza array di destinazione)
Corretto?

Purtroppo ho riscontrato che non funziona correttamente, mi fa dei pasticci mischiando le lettere.

Primo risultato con memmove su gluglu http://www.cplusplus.com/reference/cstring/memmove/

Le operazioni su blocchi di memoria si riferiscono sempre a byte, quindi array di char o di byte.