Aide communication entre arduino et logiciel PC spécifique svp !

Salut à tous,
Je m'appelle Samuel et je suis nouveau sur ce forum.
Avant tout merci pour ce forum car grace à vous, j'ai appris énormément en programmation arduino et j'ai toujours trouvé réponse dans vos posts, mais cette fois ci je suis bloqué et j'ai besoin de votre aide.

Je débute donc en programmation et je tente de réaliser une interface arduino détecteur de nuage qui interagit avec un logiciel déja existant.

Le protocole de communication de ce logiciel, ainsi que le logiciel gratuit est expliqué sur le site du concepteur, je vous donne le lien.

rs232 protocol :
http://www.aagware.eu/aag_cloudwatchertechinfo.htm

le logiciel est ici :

http://www.aagware.eu/aag_cloudwatcher700.htm

Voici le code que j'ai réalisé pour réagir avec le logiciel
Il a pour but pour l'instant de tester la communication avec le logiciel et les données qu'il renvoie sont statiques, (pas encore de capteurs connectés).
Le code fonctionne bien en test par le serial monitor, mais je n'ai pas de réaction du logiciel.
1 - Je pense qu'il ne comprends pas les chaines de caractère que mon code lui renvoie.
2 - Le logiciel envoie des données séries avant que le port série de l'arduino ne soit pret. ( vu avec un sniffer port série )

//DETECTEUR DE NUAGES AAG ARDUINO

void setup(){
  Serial.begin(9600); // Démarrage du port série
  String msg ="";
  char lettre = '0';
  establishContact(); // etablit le contact sur le port série en envoyant un handshaking block
}



void loop(){
  String msg ="";
  char hsb [16]= {'!', 0x11,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','0'}; // Déclaration Handshaking block
  char lettre = '0';
    
  
    if(Serial.available() > 0) // si donnée présente
    {
    while(Serial.available() > 0 ) // tant qu'il y a des données :
       {
     lettre = Serial.read(); // lire et stocker les données dans "lettre"
      
      if (lettre == '!') // teste si '!' présent et arrete la lecture
         {
           msg += lettre; 
           delay(250);
           break; 
         }
      else // si pas de '!' continue la lecture
         {
           msg += lettre;
           delay(250);
         }
                  
       }
      // ici on commence à tester toutes les commandes reçues
      // et on retourne la chaine de caractère correspondante.
      if (msg == "K!")  
      {
        Serial.print("!K1234         "); // Serial number
        Serial.print(hsb);
      }
      else if (msg == "A!")
      {
        Serial.print("!N Cloudwatcher"); // Internal name
        Serial.print(hsb); 
      }
        
      else if (msg == "B!")
      {
         Serial.print("!N         1.10"); // Firmware version
         Serial.print(hsb);
      }
      else if (msg == "C!")
      {
        Serial.print("!6         0990"); // Zener voltage
        Serial.print("!3         1000"); // Ambient Temperature
        Serial.print("!4         1000"); // LDR voltage
        Serial.print("!5         1000"); // Rain sensor Temperature
        Serial.print(hsb);
      }
      else if (msg == "D!")
      {
        Serial.print("!E1       11111"); // 1st address byte errors
        Serial.print("!E2       11111"); // Command byte errors
        Serial.print("!E3       11111"); // 2nd address byte errors
        Serial.print("!E4       11111"); // PEC byte errors
        Serial.print(hsb); 
      }
      else if (msg == "E!")
      {
        Serial.print("!R         1000"); // Rain frequency
        Serial.print(hsb);
      }
      else if (msg == "F!")
      {
        Serial.print("!X             "); // Switch Open
        Serial.print(hsb);
        //Serial.print("!Y             "); // Switch Close
        //Serial.print(hsb); 
      }
      else if (msg == "G!")
      {
        Serial.print("!X             "); // Switch Open
        Serial.print(hsb);
      }
      else if (msg == "H!")
      {
        Serial.print("!Y             "); // Switch Close
        Serial.print(hsb);
      }
      else if (msg == "Ppppp!")
      {
        Serial.print("!Q         1000"); // PWM duty cycle
        Serial.print(hsb);
      }
      else if (msg == "Q!")
      {
        Serial.print("!Q         1000"); // PWM duty cycle
        Serial.print(hsb);
      }
      else if (msg == "S!")
      {
        Serial.print("!1        01200"); // IR sky temperature
        Serial.print(hsb);
      }
      else if (msg == "T!")
      {
        Serial.print("!1        02000"); // IR sensor temperature
        Serial.print(hsb);
      }
      else if (msg == "z!")
      {
        Serial.print(hsb);
      }
      else 
      {
        Serial.print("Commande non reconnue !");
      }
      
    }
  
}

void establishContact() {
  char hsb [16]= {'!', 0x11,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','0'}; // Déclaration Handshaking block
    
  while (Serial.available() <= 0) {
    Serial.print("!N         1.10"); // Firmware version    
    Serial.print(hsb);   // send a handshaking block
    delay(300);
  }
}

Pourriez vous me dire où est ce que je me trompe dans le code et me filer un peu de votre tps pour m'aider à faire fonctionner mon interface avec ce logiciel ?

Merci

Sam974

Personne pour me filer un petit coup de pouce ? =(

1 - Je pense qu'il ne comprends pas les chaines de caractère que mon code lui renvoie.
2 - Le logiciel envoie des données séries avant que le port série de l'arduino ne soit pret. ( vu avec un sniffer port série )

Ligne 1: Arduino envoie des données au soft ?
Ligne 2: Le soft envoie des données à l'Arduino ?
Je pense que ton histoire est un peu trop brumeuse pour quelqu'un puisse te répondre.
Que branche-tu où et quand ? Schéma ? Pseudo code de déroulement des opérations ?

Edit: Après, faut être bien conscient de ce qu'on demande. Là, il s'agit de charger un soft, de le déziper, (ouch! c'est une usine à gaz; et en plus, y' a un installeur (trop compliqué de faire un soft portable); si on n'a pas une VM, on y va en reculant).
On installe. Oh pétard ! une interface de ouf, truffée de paramètres (et qu'on ne pourra pas faire fonctionner, vu qu'il n'y a pas les capteurs).
Dans ton cas, c'est pas un max... C'est un super max d'infos qu'il faut que tu remmène.