IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Conversion de string en Tab char


Sujet :

Arduino

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Analyse système
    Inscrit en
    Février 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2014
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Conversion de string en Tab char
    Bonjour la communauté, j'essaie de convertir simplement une str en tableau de char à l'aide de toCharArray(), mais il y a un probleme et je le comprend pas.
    En résultat j'ai :

    Exemple si j'envoie en Serial ZUT< :

    nombre de caractere; 4
    Z
    U
    T
    <

    si l'on recommence str = ZUT<

    nombre de caractere; 6
    ZUT<

    vide
    vide
    Z
    U
    T
    <

    Ma question : Pourquoi 6 alors que j'ai 4 caracteres, cela est correct sur 1 itéraction mais après toujours 6.
    Les caracteres sont décalé. Comprenez vous le probleme?
    Je vois pas le problème, j'ai cherché dans tous les sens..

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    String inputString = "";         // a String to hold incoming data
    bool stringComplete = false;  // whether the string is complete
    char tabCommande[10]="";
    int i;
     
    void setup() {
      // initialize serial:
      Serial.begin(9600);
      inputString.reserve(10);
    }
     
    void loop() {
      // print the string when a newline arrives:
      if (stringComplete) {
     
        //Affichge str
        Serial.print("Nombre de caractere:"); Serial.println(inputString.length());     
        Serial.print("str : "); Serial.println(inputString);
     
         //Affiche tableau
        for(i=0; i<inputString.length(); i++)
        {
        Serial.print("case : "); Serial.println(tabCommande[i]);
        tabCommande[i] = 0; //clear 
        }
     
        // clear the string:
        inputString = "";
        stringComplete = false;
      }
    }
     
    /*
      SerialEvent occurs whenever a new data comes in the hardware serial RX. This
      routine is run between each time loop() runs, so using delay inside loop can
      delay response. Multiple bytes of data may be available.
    */
    void serialEvent() {
      while (Serial.available()) {
        // get the new byte:
        char inChar = (char)Serial.read();
        // add it to the inputString:
        inputString += inChar;
        // if the incoming character is a newline, set a flag so the main loop can
        // fin de caractere
        if (inChar == '<') {
          stringComplete = true;
          //convert in array
          inputString.toCharArray(tabCommande,inputString.length()+1);
        }
      }
    }

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 648
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 648
    Points : 11 137
    Points
    11 137
    Par défaut
    Bonjour,

    utilise plutôt Serial.readBytesUntil(character, buffer, length)
    J'ai pris le caractère "<" comme fin de chaîne.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    const int CHAR_COUNT = 10;
    char buf[CHAR_COUNT];
    size_t n;
     
    void setup()
    {
        Serial.begin(9600);
        memset(buf,0,sizeof(buf));
    }
     
    void loop()
    {
        if (Serial.Serial.available()) 
        {
             n = Serial.readBytesUntil("<", buf, CHAR_COUNT);
             if (n > 0)
             {
                  for (int i=0; i<n; i++)
                       Serial.println(buf[i]);
             }
             memset(buf,0,sizeof(buf)); // raz de buf
        }
     
    }

  3. #3
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 771
    Points : 5 570
    Points
    5 570
    Par défaut
    vous avez 6 caractères parce que vous avez dû configurer le Moniteur Série pour qu'il envoie CR et LF ('\r' et '\n') comme fin de ligne.
    la première fois vous vous arrêtez bien au symbole '>' mais il reste dans le buffer série le CR et le LF
    la deuxième fois, vous les lisez et continuez jusqu'au symbole '>' suivant et donc vous avez 2 caractères cachés en plus

    --> modifiez le paramétrage du moniteur série pour ne rien rajouter en fin de ligne
    --> ou alors modifiez le code pour ignorer le CR et le LF s'ils sont reçus

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/06/2017, 11h15
  2. Réponses: 13
    Dernier message: 27/03/2013, 10h43
  3. Réponses: 3
    Dernier message: 04/05/2010, 08h58
  4. Réponses: 2
    Dernier message: 08/12/2009, 12h57
  5. [C++.Net] Conversion de String en char
    Par tunisienne84 dans le forum MFC
    Réponses: 3
    Dernier message: 27/04/2006, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo