Découpage message sur arduino

kamal3018 Messages postés 6 Statut Membre -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour

j'espère que vous allez bien
je voulais savoir si vous pouvez m'aidé
je reçoit se message "X00/00/00 04:45:03 1234 000 B J 019074 A N 00 G 00.00" par rs 232 sur arduino et je voulais découpé à chaque espace " " pour récupéré quelque partie après l'espace pour les imprimés sur un écran lcd16/2

Merci à vous

2 réponses

  1. kamal3018 Messages postés 6 Statut Membre
     
    re
    moi j'ai ce code

    #include <LiquidCrystal.h>
    // chaine de caractères pour contenir les données brutes
    String inputString = "";
    const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
    // pour savoir si la chaine est complète
    boolean stringComplete = false;
    LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
    int cnt = 0; // nombre de données découpées
    String data[10]; // stockage des données découpées

    void setup() {
    lcd.begin(16, 2);
    Serial.begin(9600);
    lcd.setCursor(0,0);
    lcd.print(" Scanner un ANT");
    lcd.setCursor(0,1);
    lcd.print(" Scan een ANT");
    }

    void loop() {
    // si le message est complet
    if (stringComplete) {
    // on le découpe à chaque espace ' '
    // et on stocke les bouts dans un tableau
    splitString(inputString, ' ');

    // appel des fonctions selon le premier sélecteur
    if (data[0] == "X00/00/00") {
    light(data[1].toInt(), data[2].toInt());
    }

    // vide la chaine
    inputString = "";
    stringComplete = false;
    }
    }

    // serialEvent()
    void serialEvent() {
    while (Serial.available()) {

    // récupérer le prochain octet (byte ou char) et l'enlever
    char inChar = (char)Serial.read();
    // concaténation des octets reçus
    inputString += inChar;

    // caractère de fin pour notre chaine
    if (inChar == '\n') {
    stringComplete = true;
    }
    }
    }

    // méthode pour découper le message avec un séparateur (ou "parser")
    void splitString(String message, char separator) {
    int index = 0;
    cnt = 0;
    do {
    index = message.indexOf(separator);
    // s'il y a bien un caractère séparateur
    if(index != 0) {
    // on découpe la chaine et on stocke le bout dans le tableau
    data[cnt] = message.substring(0,index);
    cnt++;
    // on enlève du message le bout stocké
    message = message.substring(index+1, message.length());
    } else {
    // après le dernier espace
    // on s'assure que la chaine n'est pas vide
    if(message.length() > 0) {
    data[cnt] = message.substring(0,index); // dernier bout
    cnt++;
    }
    }
    } while(index >=0); // tant qu'il y a bien un séparateur dans la chaine
    }

    // fonction personnalisable
    void light(int pin, int brightness) {

    Serial.print("Tram ");
    Serial.print(pin);
    Serial.print(" POST ");
    Serial.println(brightness);

    //analogWrite(pin,brightness);
    }

    en fait je reçois ce message à chaque passage d'un tram "X00/00/00 04:45:03 1234 000 B J 019074 A N 00 G 00.00" et je doit afficher ses information sur un écran lcd 16/2

    je recouper 1234,B,A,N,G

    et je les imprime par exemple : Tram 1234 Post B
    Ant A MdF N ED G

    Merci à vous
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Comme indiqué, tu peux utiliser
      strtok()
      avec le caractère espace. Vois l'exemple dans la documentation dont je t'ai donné le lien et comment la boucle lançant
      strtok()
      permet de récupérer les données entre le(s) caractère(s) séparateur(s). Là tu aurais un seul caractère séparateur : l'espace et ton appel serait du genre
      pch = strtok (str," ");
      au lieu de
      pch = strtok (str," ,.-");
      dans l'exemple donné.

      Utilise un compteur qui te permet de savoir sur quel caractère espace
      strtok() 
      s'est arrêté, par exemple "1234" se trouverait à la 3ème itération de la boucle, et pour décider si tu exploites ou non ce qu'a trouvé
      strtok()
      sur l'itération donnée ou si tu passes au caractère espace suivant parce que tu décides d'ignorer une partie de la chaîne.
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Par exemple :
      #include <stdio.h>
      #include <string.h>
      
      int main(void) {
          char str[255] = "X00/00/00 04:45:03 1234 000 B J 019074 A N 00 G 00.00";
          char * pch;
          int count = 0;
      
          pch = strtok(str," ");
          while (pch != NULL) {
              count++;
              if (count == 3)
                  printf("Tram %s\n",pch);
              pch = strtok(NULL, " ");
          }
      
          return 0;
      }

      affiche :
      Tram 1234
      0
    3. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      note que
      strtok()
      est une fonction C et fonctionne sur des chaînes C (zone mémoire avec des
      char
      consécutifs terminés par un
      '\0'
      ) stockées dans une zone mémoire où le programme doit être mesure d'écrire, puisque la fonction va "saucissonner" la chaîne de départ, en écrasant les caractères séparateurs qu'elle trouve avec des
      '\0'
      , créant ainsi autant de sous-chaînes que nécessaire.
      0
    4. kamal3018 Messages postés 6 Statut Membre
       
      j'ai injecté le code sur mon arduino et j'ai envoyé l'exemple sur mon arduino via serial par un câble rs232] et j'ai rien de retour je reçois que des carré
      le message que je reçois X00/00/00 04:45:03 1234 000 B J 019074 A N 00 G 00.00 chaque fois change et chaque tram à son numéro j'ai prie exemple d'un tram que le numéro 1234
      0
    5. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Tu as envoyé quoi à ton arduino ?
      0