Suponiendo que sepas el tamaño máximo que va a tener la cadena entera, y el número máximo de partes en que la vas a dividir, yo tal vez haría algo así (no está probado, pero para que te hagas una idea de por dónde quiero ir):
#define maxsize 1000
#define maxparts 100
void setup() {
Serial.begin(9600);
}
void loop() {
char buffer[maxsize]; // buffer para recibir la cadena
char *parte[maxparts]; // array de punteros a cada subcadena
char caracterRecibido; // caracter que llega por Serial
int indicebuffer=0, // posición del buffer donde se escribirá el caracter que llegue
comienzo=0, // posición del buffer donde comienza la subcadena que se está recibiendo
indiceparte=0; // índice de subcadena recibiéndose
if (Serial.available()){
do{
delay(5);
caracterRecibido=Serial.read(); // almacenamos temporalmente el caracter recibido
if(caracterRecibido==';'|| caracterRecibido=='\0'){ // Si se recibe ; o fin de cadena
buffer[indicebuffer]='\0'; // se escribirá fin de cadena de todos modos. Hemos terminado de recibir una parte.
parte[indiceparte]=buffer+comienzo; // asignamos al puntero de parte actual la dirección del buffer + índice caracter donde comenzaba la subcadena
indicebuffer++; // avanzamos el índice donde recibir el siguiente caracter
indiceparte++; // Lo que venga corresponderá a la siguiente parte
comienzo=indicebuffer; //la siguiente parte comenzará después del ; recibido
} else {
buffer[indicebuffer]=caracterRecibido; //recibimos un caracter normal dentro de la subcadena que se está procesando
indicebuffer++; // avanzamos el índice donde recibir el siguiente caracter
}
} while(caracterRecibido!='\0' && indicebuffer<maxsize && indiceparte<maxparts); // salimos si recibimos final de cadena, se sobrepasa el tamaño de buffer o el número de subcadenas
}
}