Comunicazione seriale tra Arduino Mega e Arduino Due

Il primo inserisce zeri in per tutta l'area di memoria dove è presente il buffer (sizeof), il secondo solamente per la parte iniziale, fino al primo byte a zero (strlen). Sostanzialmente per una stringa è la stessa cosa (il primo comunque più rapido), nel secodo devi essere sicuro che la stringa sia correttamente terminata con 0x0.

Per tornare alla tua domanda, non hai bisogno di azzerare nulla sulla Serial1 perché la Serial1.read() legge il byte dal buffer interno di Arduino togliendolo dal buffer. Poi quello che ci fai tu è compito tuo :wink:

In pratica nel tuo codice vedo che vorresti leggere tutti i caratteri ricevuti, fino al terminatore ';' incluso e mettere questo nel buffer.
Dato che ne ho fatto parecchi, vorrei darti qualche consiglio. Quando si implementano protocollini seriali come questo, è sempre bene gestire separatamente la ricezione dei caratteri dalla loro gestione.

Mi spiego meglio. Intanto nella ricezione caratteri è bene applicare sempre un "filtro" che verifichi la correttezza del pacchetto: se hai un carattere di inizio (':') è sempre bene ignorare qualsiasi cosa che non inizia con quello. Poi a te serve tutto ciò che c'è tra ':' e ';' quindi puoi anche evitare di tenere nel buffer questi due caratteri (che nel tuo codice continui a verificare inutilmente). Ed infine l'elaborazione del pacchetto la farai solamente quando riceverai il ';'.

Ossia una cosa di questo tipo:

// Nota: dimensionare i buffer
#define MAXBUF 8
char buf[MAXBUF];   // Buffer di ricezione
char cmd[MAXBUF-2]; // Ultimo comando ricevuto (esclusi ':' e ';')
...
void loop() {
  LeggiComando();
  ...
}

void LeggiComando() {
  if (Serial1.available()) {
    char ch = Serial1.read();
    // Se il primo carattere non è ':' lo ignoro
    if ( c == 0 && ch != ':' )
      return;
    // Se è il terminatore, elaboro il comando
    if ( ch == ';' ) {
      // termino la stringa del buffer
      buf[c] = '\0';
      // Copio il comando nel buffer del comando
      strcpy(cmd, buf);
      // Resetto il buffer per ricevere i prossimi
      c = 0;
      // Faccio quello che devo fare, interpretando il comando.
      EseguiComando();
    }
    else {
      // Controllo l'overflow del buffer, scartando il pacchetto errato ossia che
      // non contiene il terminatore
      if (c == MAXBUF-1) {
        c = 0;
        return;
      }
      // E' un carattere interno del comando, lo memorizzo nel buffer
      buf[c++] = ch;    
    }
  }
}

void EseguiComando() {
  // Ad esempio:
  if ( strcmp(cmd, "Z2") ) {
    // Comando Z2
    ...
    return;
  }
  if ( strcmp(cmd, "Y3") ) {
    // Comando Y3
    ...
    return;
  }
  ... eccetera
}