[PROBLÈME] Réception String sur le port série et transfert dans un tableau.

Bonjour à tous, je suis actuellement en Terminale STI2D et je bloque sur mon projet BAC qui est sur une imprimante 3D et notamment l'interprétation de commandes par les moteurs pas à pas.
Je souhaiterai envoyer dans le moniteur une suite de commande comme par exemple V010X0010Y0100.
dans cette commande je voudrais que lorsque le programme voit la lettre V, il prenne le nombre qui vient après dans la chaîne (ce n'est pas forcement le nombre qui est en haut,cela peut être n'importe quel nombre) et l’intègre à la vitesse des moteurs.
Ensuite lorsque le programme voit le X, il prenne le nombre à la suite et l’intègre au nombre de pas pour le moteur et ainsi de suite pour le Y.
Mon problème est : je n'arrive pas à mettre cette chaîne dans un tableau puis de la faire analyser par le programme, cela ne fonctionne pas, les moteurs font n'importe quoi.importe quoi.

/* 
#include <string.h>
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"

Adafruit_StepperMotor *myMotor1 = AFMS.getStepper(200, 1);
Adafruit_StepperMotor *myMotor2 = AFMS.getStepper(200, 2);

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps

  AFMS.begin();  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz
  myMotor1->setSpeed(1000);  // 10 rpm  
  myMotor2->setSpeed(1000);
 
}
void loop()
{
   char comA,comB,comC;
   int i;
   char s[12];
   char varA,varB,varC,varD,varE,varF,varG,varH,varI,varJ,varK;
   
   while(Serial.available())// alors il y a des données à lire
   {
          for(i=0;i!=13;++i)
          {
              s[i]=Serial.read();
               Serial.println(s[i]);
          
          }
     
     if (s[0]=='V') //vitesse V
     {
           comA,varA,varB,varC=0;
           
             varA=s[1];
             varB=s[2];
             varC=s[3];
             
           
             comA=varA*100 + varB*10 + varC*1;           
            
     }
     Serial.print("s[0] = ");  Serial.println(s[0]); 
     if(s[4]=='X');//si on lit le caractere X
     {   
       comB,varD,varE,varF,varG=0; 
        
             varD=s[5];
             varE=s[6];
             varF=s[7];
             varG=s[8];
           
             comB=varD * 1000 + varE * 100 + varF * 10 + varG * 10 ;         
             myMotor1->step(comB, FORWARD, SINGLE);
             myMotor1->setSpeed(comA);
            
     } 
     
     if(s[8]=='Y');//si on lit le caractere Y
     {  
        comC,varH,varI,varJ,varK=0; 
        
             varH=s[9];
             varI=s[10];
             varJ=s[11];
             varK=s[12];
           
         comC=varH * 1000 + varI * 100 + varJ * 10 + varK * 10 ;          
         myMotor2->step(comC, FORWARD, SINGLE);
         myMotor2->setSpeed(comA); 
     
      } 
          
    }  
}

Salut,

Avant de te répondre il faut absolument que tu répondes à une de mes questions : pourquoi vouloir réinventer la roue ? => G-code - Wikipedia

Es tu sur de recevoir à chaque fois les 12 bonnes données?
Car ton if(Serial.available()) déclenche ton code meme si il ne recoit qu'un seul truc,ce qui peut décaler tout ton code.

   char s[12];                   // <-------- tableau de 12 caractères
   char varA,varB,varC,varD,varE,varF,varG,varH,varI,varJ,varK;
   
   while(Serial.available())// alors il y a des données à lire
   {
          for(i=0;i!=13;++i)        // <----------- tu concatènes 13 caractères (0 à 12)
          {
              s[i]=Serial.read();
               Serial.println(s[i]);
          
          }
                               // Et tu ne mets pas de terminateur de chaîne

Le tableau doit être plus grand si tu veux mettre 13 caractères et ne pas oublier un caractère de plus pour mettre un '\0' à la fin de la boucle de réception qui termine la chaîne ce qui permet de la traiter avec les fonctions standards de manipulation de chaîne et aussi de l'imprimer.

     {
           comA,varA,varB,varC=0;
           
             varA=s[1];                         // contient un caractère représentant un chiffre
             varB=s[2];                        // contient un caractère représentant un chiffre
             varC=s[3];                       // contient un caractère représentant un chiffre
             
           
             comA=varA*100 + varB*10 + varC*1;           // Le résultat va être faux
            
     }

Ne pas confondre le chiffre et sa représentation.
Dans une chaîne ASCII les nombres sont représentés par un code numérique
le caractère qui représente 0 = 0x30 ou 48 décimal
le caractère qui représente 1 = 0x31 ou 49 décimal

comA=(varA-'0')*100 + (varB-'0')*10 + (varC-'0')*1;