Funziona ma non bene

Sono giorni che giro attorno a questo pezzo di codice che ho trovato in rete ma non riesco a farlo funzionare correttamente.
E' un protocollo di convalida dei dati ricevuti sulla seriale.
Ricevo sulla Serial1 e visualizzo su Serial di un Arduino mega

Entro in arduino da vb con una stringa così formata:
!!CC!0xB0!0x02!0x7F!* sono dei comandi midi

Il problema è che anche se la stringa viene inviata correttamente mi salta alla linea
else if (Serial1.available() == 0)
quindi mi invia sulla serial0 $N e poi prosegue correttamente

Se invece invio la stringa senza * quando vado ad inviare una stringa corretta la
prima volta che viene stampata è incasinata e se la reinvio è corretta.
Pensavo di inserire un Serial1.flush per svuotare il buffer della seriale
quando arriva una stringa non corretta ma anche così non funziona.

Poi io vorrei avere una stringa con un solo ! iniziale e un * finale e tra un byte e l'altro
inserire un carattere diverso, che so un # solo per distinguere la suddivisione per avere
alla fine una cosa così:
!CC#0xB0#0x02#0x7F*

Qualcuno può spendere un po' di tempo per verificare questo codice ?
Sono veramente allo stremo delle forze.

Grazie, Alberto

/*===========================
TITLE: Serial Echo Code v1.1
AUTHOR: Fayaz Kadir
DESCRIPTION: If you send a string starting with "!" and ending with "*", the Arduino responds back with "$Y" for valid data string, or $N for invalid data string. You can modify this code for your use.
COMPATIBLE BOARD: Arduino Mega (but any other Arduino should work fine)
============================*/
char string[25];
int i=0;
int string_len;
int inByte;
int last_inByte;
int counter=0;

void setup() {
  Serial.begin(9600); //INTIALISING THE MIDI SERIAL PORT
  Serial1.begin(9600); //INTIALISING THE CONTROLLER SERIAL PORT
}

void loop()  // LOOP FUNCTION
{
  inByte = Serial1.read();
  string_len=0;
  if (inByte == '!')  read_serial();  // If Start of line ("!") is found, call read_serial() function
}

void read_serial()  // FUNCTION FOR READING THE SERIAL MESSAGE
{
   Serial.println ("SOL FOUND and reading");  // THE SOL (Start of Line) found notice.
   Serial.print("READ : !\n");  //Saying that it has read "!" on the serial port
   while (inByte!= '*') // As long as EOL not found, keep reading
   if (Serial1.available() > 0) // if new data is available
     { 
       inByte = Serial1.read(); // Read new byte
         Serial.print("READ : "); // Display the new byte
         string[string_len] = inByte; // Save the data in a character array
         Serial.println(string[string_len]); // Print the characters that was recieved
         string_len++;
     }
     else if (Serial1.available() == 0) 
       {
           Serial.println("EOL not available, data string invalid"); // If EOL not in the string
           Serial1.print("$N"); //FAIL SIGNATURE
           break;
       }

 if (inByte == '*')
  {
       Serial.println ("eol FOUND, and full string was");  // Echoes Success Message
       Serial1.println ("$Y"); //SUCCESS SIGNATURE
       for (i=0;i<(string_len-1);i++) Serial.print(string[i]);
       Serial.print ("\n");
   }
 }
void loop()  // LOOP FUNCTION
{
  inByte = Serial1.read();
  string_len=0;
  if (inByte == '!')  read_serial();  // If Start of line ("!") is found, call read_serial() function
}

Non so cosa succede se leggi dalla seriale e quella non ha dati.
Non é meglio controllare se ci sono dati da leggere?

if (Serial1.available() > 0)

Ciao Uwe

I dati sulla seriale arrivano solo se li mando da visual basic.
Normalmente dal monitor quando non invio non vedo niente mentre
Se mando i dati il primo ! Scatena il read fuori dal loop, ma available
e' uguale a 0 mi manda il $N fa un break sul while e ritorna al loop.
Dopodiche' ogni carattere preceduto da ! Viene letto correttamente.
Il problema e' proprio fargli capire che quello e' il primo !.

metti un flag che setti al primo ! e cancelli al *
Ciao Uwe

e se non c'è l'asterisco ?

se non c'é l' asterisco la stringa non é ancora trasmessa del tutto. Tu cercavi il primo punto esclamativo?
Ciao Uwe