Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Byte depuis un tableau


Sujet :

Arduino

  1. #1
    Membre régulier
    Byte depuis un tableau
    Bonjour,

    Je transmet, au travers de la liaison série un ensemble de data. Exemple :
    1000/0b00000001/0;3000/0b00000000/0;3500/0b00000001/0;3800/0b00000000/1
    Je me retrouve donc avec 4 parties contenant chacune, dans un tableau (j'ai mis les index [x]):

    [0] 1000/0b00000001/0
    [1] 3000/0b00000000/0
    [2] 3500/0b00000001/0
    [3] 3800/0b00000000/1
    Je rencontre un souci avec la partie binaire. Je la retrouve bien si je la place dans une variable string, ors, j'aimerais la garder au format binaire sous un Byte.

    Il s'avère que, quand j'exécute mon code je retrouve ceci :

    1000
    31
    0
    3000
    43
    0
    3500
    55
    0
    3800
    67
    1
    Comment 0b00000001 devient 31 ? si je convertit 0x01 et 1
    Comment 0b00000000 devient 43 ? si je convertit 0x00 et 0
    Comment 0b00000001 devient 55 ? si je convertit 0x01 et 1
    Comment 0b00000000 devient 67 ? si je convertit 0x00 et 0

    Donc c'est erroné !

    Voilà donc le morceau de code qui fait en partie le taff :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    /* VARIABLES*/
    int timer = 0;
    byte port = 0x00;
    boolean stopWave = 0;
     
    for(int j = 0; j < numCmds; j++)
    {
       timer = atoi(strtok_r(cmds[j], "/", &ptr));
       port = strtok_r(NULL, "/", &ptr);                   //Ligne qui pose problème
       stopWave = atoi(strtok_r(NULL, "/", &ptr));
     
       Serial.println(timer);              //Ok
       Serial.println(port);               //NOK
       Serial.println(stopWave);       //Ok
    }


    Si voua avez une petite idée, j'ai essayer déjà pas mal de chose mais sans réel succès.

  2. #2
    Expert éminent sénior
    Bonsoir,

    je ferais un découpage supplémentaire (split) avec le "/" comme séparateur puis j'appliquerai cette méthode pour convertir les binaires en entier :
    https://stackoverflow.com/questions/...eger-with-atoi

  3. #3
    Membre régulier
    Et, justement, j'ai essayé... sans succès !

    Donc, j'ai essayé atoi, strtol...

    Bref, compliqué !

    Mais j'avance, mon code aussi, je débug pas mal de choses à côté.

    Merci du coup de main Auteur

  4. #4
    Expert éminent sénior
    Liens :
    https://www.arduino.cc/reference/en/.../stringobject/
    http://www.cplusplus.com/reference/cstring/strtok/

    J'ai modifié la première chaîne binaire pour valider le résultat

    Code Arduino :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
      String a, w;
      char *pch;
      int n;
     
      a = "1000/0b00011001/0;3000/0b00000000/0;3500/0b00000001/0;3800/0b00000000/1";
     
      Serial.begin(9600);
     
      pch = strtok(a.c_str(), ";/");
     
      while (pch!=NULL)
      {
        w = pch;
        if (w.startsWith("0b"))
        {
          w = w.substring(2);
          n = strtol(w.c_str(), NULL, 2);
        }
        else
          n = w.toInt();
     
        Serial.println(n);
     
        pch = strtok(NULL, ";/");
     
      }


    affiche
    1000
    25
    0
    3000
    0
    0
    3500
    1
    0
    3800
    0
    1

  5. #5
    Membre régulier
    C'est ce que je viens de faire, c'est parfait ! Ca a été un peu galère

    Merci Auteur.