Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ARDUINO] Enregistrement d'une trame et décodage

    7 juin 2013 à 8:50:50

    Bonjour, 

    Je viens ici pour un problème d'Arduino :

    En fait je dois recevoir en ethernet une trame et je dois la décoder, comme j'n'ai aucune idée de comment faire, j'ai pensé à l'enregistrer dans une carte sd pour la déchiffrer caractère par caractère, mais je bloque vraiment pour ça.. J'ai ça pour le moment, pour la lecture de la trame : 

    (la trame se présente comme ceci : 

    <ExternalData><Frames><Speed>0.5</Speed><Accel>1</Accel><Commande>1</Commande><Mouvement>2</Mouvement>Lissage>TRUE</Lissage><Taille_Tab_Pos>14</Taille_Tab_Pos><Xframe XPos="1880" YPos="0" ZPos="1945" ARot="0" BRot="90" CRot="0" /></Frames></ExternalData>

    Et je dois récupérer les valeurs XPos="1880" YPos="0" ZPos="1945" ARot="0" BRot="90" CRot="0" )

    #include <SD.h>
    #define cs 10
    
    unsigned long taille;
    File fichier;
    
    
    void setup()
    {
        Serial.begin(9600);
        
        if (!SD.begin(4)) { // test si la carte est présente et sans erreur
            Serial.println("Carte illisible");
            return;
        }
        
        fichier = SD.open("Position.xml"); // ouvre le fichier
        
        if (!fichier) { // test si l'ouverture a raté
            Serial.println("Erreur d'ouverture du fichier");
            return;
        }
        else {
            Serial.println("Fichier ouvert.");
        }
        
        taille = fichier.size(); //enregistre la taille du fichier
    }
    
    void loop()
    {
        char chaine[taille]; // init de la chaine, de la taille de celle du fichier
        int i;
        String Xpos;
        String Ypos;
        String Zpos;
        String Arot;
        String Brot;
        
        while (fichier.available())
        {
            chaine[i] = fichier.read(); 
            
            i++;
        }
        
        for(i=0; i<taille; i++)
        {
        
        if (chaine[i] == 'X' && chaine[i+1] == 'f' && chaine[i+2] == 'r' && chaine[i+3] == 'a' )
        {
                  do
                  {
                    i++;
                
    //RECUPERATION XPOS
                    if (chaine[i] == 'X' && chaine[i+1] == 'P' && chaine[i+2] == 'o' && chaine[i+3] == 's' && chaine[i+4] == '=' && chaine[i+5] == '"')
                    {
                      i+=5;
                      
                      do{
                      i++;
                      //Serial.print(chaine[i]);
                      Xpos += chaine[i];
                   }
                      while(chaine[i+3] != 'Y');
                    }
                    
    //RECUPERATION YPOS
                    if (chaine[i] == 'Y' && chaine[i+1] == 'P' && chaine[i+2] == 'o' && chaine[i+3] == 's' && chaine[i+4] == '=' && chaine[i+5] == '"')
                    {
                      i++;
                      i++;
                      i++;
                      i++;
                      i++;
                      do{
                      i++;
             //         Serial.print(chaine[i]);
             Ypos += chaine[i];
                   }
                      while(chaine[i+3] != 'Z');
                    }
                    
    //RECUPERATION ZPOS
                    if (chaine[i] == 'Z' && chaine[i+1] == 'P' && chaine[i+2] == 'o' && chaine[i+3] == 's' && chaine[i+4] == '=' && chaine[i+5] == '"')
                    {
                      i++;
                      i++;
                      i++;
                      i++;
                      i++;
                      do{
                      i++;
                      Zpos += chaine[i];
          //            Serial.print(chaine[i]);
                   }
                      while(chaine[i+3] != 'A');
                    }
                    
    //RECUPERATION AROT
                    if (chaine[i] == 'A' && chaine[i+1] == 'R' && chaine[i+2] == 'o' && chaine[i+3] == 't' && chaine[i+4] == '=' && chaine[i+5] == '"')
                    {
                      i++;
                      i++;
                      i++;
                      i++;
                      i++;
                      do{
                      i++;
                      Arot += chaine[i];
                  //    Serial.print(chaine[i]);
                   }
                      while(chaine[i+3] != 'B');
                    }
                    
    //RECUPERATION BROT
                    if (chaine[i] == 'B' && chaine[i+1] == 'R' && chaine[i+2] == 'o' && chaine[i+3] == 't' && chaine[i+4] == '=' && chaine[i+5] == '"')
                    {
                      i++;
                      i++;
                      i++;
                      i++;
                      i++;
                      do{
                      i++;
                      Brot += chaine[i];
                 //     Serial.print(chaine[i]);
                   }
                      while(chaine[i+3] != 'C');
                    }
                    
                    
                }
                  while(chaine[i] != '/');
           
                Serial.print("X = ");
                Serial.println(Xpos);
                Serial.print("Y = ");
                Serial.println(Ypos);
                Serial.print("Z = ");
                Serial.println(Zpos);
                Serial.print("A = ");
                Serial.println(Arot);
                Serial.print("B = ");
                Serial.println(Brot);
        }
    
        }
        while(true);
    }

    Je sais pas si ma demande est facile à comprendre, j'ai vraiment du mal à m'exprimer ><

    Merci d'avance.

    C.

    PS : Soyez indulgents s'il vous plait, je suis débutante.. 

    -
    Edité par Sug 7 juin 2013 à 8:51:33

    • Partager sur Facebook
    • Partager sur Twitter
      7 juin 2013 à 8:53:40

      Tu es sur que tu bosses en Ethernet ? parce que dans l'état actuelle de ton programme il n'y a rien à propos de l'Ethernet oO
      • Partager sur Facebook
      • Partager sur Twitter

      Retrouvez moi sur mon blog et ma chaine Youtube !

        7 juin 2013 à 9:04:00

        Ah oui j'ai oublié un bout, en fait ça c'est juste le décodage de la trame, pour la connexion j'ai ça : 

        #include <Ethernet.h>
        #include <String.h>
        #include <SPI.h>
        
          char trame;  
          char chaine[1000];
          int pointeurChaine = 0;
          char* testChaine;
        byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
        byte ip[] = { 192,168,1,241 };
        byte server[] = { 192, 168, 1, 31 }; //Adresse du serveur
        
        EthernetClient client;
        
        void setup()
        {
          Ethernet.begin(mac, ip);
          Serial.begin(9600);
        
          delay(1000);
        
          Serial.println("Connexion...");
        
          if (client.connect(server, 6008)) {
            Serial.println("Connected");
          } else {
            Serial.println("Echec de la connexion");
          }
        }
         
        void loop()
        {  
        connexion();
        lireClient();
        }
        
        
        
        
        
        
        
        
        //FONCTION CONNEXION
        void connexion() {  
          if (!client.connected()) {
            Serial.println("Disconnected. Tentative de reconnexion en cours.");
            client.stop();
            while(!client.connected()) {
              if (client.connect(server, 6008)) {
                  Serial.println("Connected");
                }
              }
          }
        }
        
        //FONCTION LIRE LE CLIENT
        void lireClient() {
        
          if(client.available())  
          {
            trame = client.read();
            Serial.print(trame);
            
        }
        
        
        
        
        
                        
                        
        



        • Partager sur Facebook
        • Partager sur Twitter
          12 juin 2013 à 10:30:03

          Personne ne peut m'aider à enregistrer la trame dans un document texte ou même directement la décoder ? :/
          • Partager sur Facebook
          • Partager sur Twitter
            12 juin 2013 à 15:58:46

            déjà teste si tu reçois bien des données...Affiche la trame reçue directement en état brut. Si ça marche, alors il faut que tu revois au niveau de ton code ce qui merde : déjà faudrait savoir ce qui plante. Qu'est ce qui te dérange dans le résultat ?

            Ensuite as tu des balises/identifieurs/codes hexa de référence, pour te situer dans la trame ? Car ça me parait bizarre de se repérer juste au caractère suivant.  Dans l'immédiat, ton code est très désordonné je  trouve pour un décodage de trame, si tu connais le principe de la machine a états...Ca t'aidera à débug. Je procède toujours ainsi tu peux mieux situer l'état ou le souci se pose.

            Et surtout, oublie l'idée de passer par un fichier pour le moment. Commence par débugguer le décodage en lui même : stocke directement la trame (tu as combien d'octets exactement ? si tu connais les positions et que la trame est dans un format fixe précis, compte directement les bits), et exploite la. Si tu as le bon résultat, alors la on pourra regarder pour le fichier :)

            La j'avoue suspecter un problème à ce niveau.

            • Partager sur Facebook
            • Partager sur Twitter

            [ARDUINO] Enregistrement d'une trame et décodage

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown