Bom acho que entendi o problema, falta você remover todos os caracteres que recebeu da serial no primeiro envio e quando há "fail".
Pois se no segundo if do seu código se der "fail" os caracteres recebidos restantes, ficaram no buffer, criando lixo para a próxima vez que ler o buffer.
Bom, não tenho o Arduino para testar aqui, mas acho q após o "fail" você faz:
.
.
.
else {
Serial.println("FAIL");
while(serial.avalaible()>0)
{
serial.read(); // Tira todos os caracteres do buffer.
}
}
ou
.
.
.
else {
Serial.println("FAIL");
Serial.flush();
}
Eu acho que o flush(), não é a função certa, mas fica como referência, a primeira opção é a que eu confiaria mais.