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 :

Split de fichier ini


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Split de fichier ini
    Bonjour, j' ai pour projet de développer une interface à base d' esp32 pour piloter des rubans led rgb adressable et j' ai besoin de découper les phrases lu dans le ini qui sont de type string pour en faire un tableau dynamique de char exploitable.
    Le nombre de mots séparés par la virgule est variable et je ne connais pas le nombre d' éléments à l' avance ( ben oui sinon c'est pas drôle )

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String txt = "initialColor=blue,0,0,255"
     
    String txt = "red,255,0,0"
     
    Item[0] = "red"
    Item[1] = "255"
    Item[2] = "0"
    Item[3] = "0"
    Je débute en c++ et très franchement, venant de VB et python, je trouve ce language déconcertant. Du coup je ne sais vraiment pas comment m' y prendre

    Si l' un ou l' une d' entre vous peut m'aider cela sera avec grand plaisir

    Merci

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 857
    Points
    56 857
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Il n'y a pas de fonction split dans la classe String d'Arduino, mais on trouve des codes sur Internet. Le plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    String item[4];
    String txt = "red,255,0,0";
     
    int r=0, t=0;
     
    for (int i=0; i < txt.length(); i++)
    { 
     if(txt.charAt(i) == ',') 
      { 
        item[t] = txt.substring(r, i); 
        r = i + 1; 
        t++; 
      }
    }
    à adapter et tester
    Édit : oups, si le nombre d'éléments du tableau et le nombre de caractères des éléments sont variables, le code ci-dessus n'est pas très optimisé

    Citation Envoyé par Nicoludique Voir le message
    Je débute en c++ et très franchement, venant de VB et python, je trouve ce language déconcertant.
    Les programmeurs C++, eux, trouvent que c'est Python qui est déconcertant. Comme quoi...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Merci
    Merci beaucoup pour votre réponse, je pensais que les tableaux de string donnaient des résultats plus qu' aléatoires, je vais tester et tenter d' adapter.

  4. #4
    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
    Bonsoir,

    tu as la fonction strtok

    Un exemple :
    https://www.developpez.net/forums/d1.../byte-tableau/

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Merci Auteur
    Cool cette fonction, je teste demain, merci

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 857
    Points
    56 857
    Billets dans le blog
    40
    Par défaut
    J'ai testé pour voir, je n'avais jamais utilisé strtok auparavant

    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
    const int LONGUEUR_STRING_MAX = 100;  // taille maxi de l'objet String
    const int LONGUEUR_ITEM_MAX   = 20;   // nbr de caractères maxi de l'item
    const int NBR_ITEMS_MAX       = 10;   // nbr d'items maxi
     
    void setup() {
      Serial.begin(115200);
     
      String str = "red,255,0,0"; // on suppose qu'on dispose d'un objet String au départ
      char delimiter[] = ",";     // délimiteur
      char *item[NBR_ITEMS_MAX];            // tableau des éléments découpés
     
      char text[LONGUEUR_STRING_MAX];
      str.toCharArray(text, sizeof(text));  // copie dans un tableau de char
     
      int nbr_items = 0;
     
      char* token = strtok(text, delimiter);
      while (token != nullptr && nbr_items < NBR_ITEMS_MAX)
      {
        item[nbr_items++] = token;
        token = strtok(nullptr, delimiter);
      }
     
      // affichage des items pour vérifier
      for (int i = 0; i < nbr_items; i++) {
        Serial.println(item[i]);
      }
    }
     
    void loop() {
      // code principal, en boucle infinie
    }

  7. #7
    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
    Citation Envoyé par f-leb Voir le message
    J'ai testé pour voir, je n'avais jamais utilisé strtok auparavant
    et ? ça a marché ?

    Le plus déconcertant pour moi est de mettre un argument NULL dans la fonction pour continuer à l'utiliser avec la chaîne donnée en paramètre la 1ère fois.

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 620
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 620
    Points : 56 857
    Points
    56 857
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par Auteur Voir le message
    et ? ça a marché ?
    Evidemment que oui

    Citation Envoyé par Auteur Voir le message
    Le plus déconcertant pour moi est de mettre un argument NULL dans la fonction pour continuer à l'utiliser avec la chaîne donnée en paramètre la 1ère fois.
    ça vient de l'algo qui est un peu complexe (voir ici, un autre tuto ).

    Au 1er appel, en passant la chaine en paramètre, on crée un pointeur ptr initialisé en début de chaîne :
    text = "red,255,0,0"
            |
           ptr
    Le délimiteur suivant est recherché, qui est remplacé par un caractère NUL \0 :
    text = "red\0255,0,0"
            |
           ptr
    La sous-chaîne "red" peut être retournée et le pointeur ptr pointe vers la sous-chaîne suivante (variable locale statique à strtok, et donc mémorisée pour l'appel suivant) :
    text = "red\0255,0,0"
                 |
                ptr
    En mettant le 1er paramètre à NULL pour l'appel suivant, on indique de reprendre le traitement à partir de la position courante mémorisée du pointeur.

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    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 715
    Points : 5 394
    Points
    5 394
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Le plus déconcertant pour moi est de mettre un argument NULL dans la fonction pour continuer à l'utiliser avec la chaîne donnée en paramètre la 1ère fois.
    oui c'est comme cela que c'est prévu

    strtok() mémorise le pointeur localement dans la fonction et si le paramètre est nullptr / NULL alors il réutilise le pointeur local (elle n'est donc pas adaptée pour un usage en multicore car si 2 tasks l'utilisent en même temps les pointeurs vont se mélanger ==> attention sur ESP32 par exemple)

    PS/ il existe strtok_r() qui effectue la même tâche mais qui est une version réentrante de strtok()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *strtok_r(char *str, const char *delim, char **saveptr);

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut enfin réussi
    bonjour, j' ai enfin réussi de 2 manières différentes :

    celle que vous m' avez indiqué :

    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
    // ---------------------------------------------------------------- PALETTE -----------------------------
    const byte PaletteNbrCol = 129 ; // nombre maxi de couleur dans la palette
    byte PaletteRGB[PaletteNbrCol][3] = {0} ; // RGB -> RGB
    String PaletteName[PaletteNbrCol] = "" ; // RGB -> nom
     
     
    // lecture du palette.ini sur la SDCARD
      myFile = SD.open("/palette.ini") ;
      if (myFile) {
        Serial.println("lecture du palette.ini sur la SDCARD") ;
    		String lectIni = "" ;
    		byte ColIndex = 0 ;
        while (myFile.available()) {
    			lectIni = myFile.readStringUntil('\n') ; // lecture d une ligne
     
     
     
    			char delimiter[] = ",";     // délimiteur
    			char *item[4];            // tableau des éléments découpés
    			char text[50];
     
    			lectIni.toCharArray(text, sizeof(text));  // copie dans un tableau de char
     
    			int ItemIndex = 0;
    			char* token = strtok(text, delimiter) ;
    			while (token != nullptr && ItemIndex < 3)
    			{
    			  item[ItemIndex] = token ;
    				if (ItemIndex < 3) {
    					PaletteRGB[ColIndex][ItemIndex] = String(item[ItemIndex]).toInt() ;
    					Serial.println(String(token) + "   [" + String(ColIndex) + "] [" + String(ItemIndex) + "] = " + String(PaletteRGB[ColIndex][ItemIndex])) ;
    					ItemIndex++ ;
    				} else {
    					PaletteName[ColIndex] = String(item[ItemIndex]) ;
    				}
    				token = strtok(nullptr, delimiter) ;
    			}
    			ColIndex++ ;
        }
        myFile.close() ;
      } else {
        Serial.println("Erreur d' ouverture du fichier palette.ini") ;
      }

    et une autre :

    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
    	// lecture du palette.ini sur la SDCARD
      myFile = SD.open("/palette.ini") ;
      if (myFile) {
        Serial.println("lecture du palette.ini sur la SDCARD") ;
    		String lectIni = "" ;
    		String buff = "" ;
    		byte ColIndex = 0 ;
    		byte ItemIndex = 0 ;
    		int strLength = 0 ;
        while (myFile.available()) {
    			lectIni = myFile.readStringUntil('\n') ; // lecture d une ligne
    			if (lectIni.indexOf(',') > 0) {
    				// decoupage par separateurs ','
    				ItemIndex = 0 ;
    				buff = "" ;
    				strLength = lectIni.length() ;
    				for(int i = 0; i < strLength; i++){
    					if(lectIni.charAt(i) != ',') {
    						buff = (buff + String(lectIni.charAt(i))) ;
    					} else {
    						PaletteRGB[ColIndex][ItemIndex] = buff.toInt() ;
    						//Serial.println("[" + String(ColIndex) + "] [" + String(ItemIndex) + "] = " + String(PaletteRGB[ColIndex][ItemIndex])) ;
    						ItemIndex = ItemIndex + 1 ;
    						buff = "" ;
    					}
    				}
    				PaletteName[ColIndex] = buff ;
    				ColIndex = ColIndex + 1 ;
    			}
        }
        myFile.close() ;
      } else {
        Serial.println("Erreur d' ouverture du fichier palette.ini") ;
      }

    mais j' ai galéré comme un fou, je n' avais pas suffisamment dimensionné PaletteRGB[PaletteNbrCol][3] au lieu de 3 j' avais mis 2 (0,1,2) je n' avais pas compris que dans l' initialisation du tableau il faut mettre le nombre d' éléments et non la valeur maxi de l' indice du tableau, du coup la première valeur lue pour chaque ligne de texte affectai la dernière valeur de l' indice de tableau précédant.

    mais là c' est bon ENFIN

    1 h à coder 3 jours a déboguer c' est pas rentable

    en tous cas merci beaucoup pour votre aide
    ca n' est pas exclus que j' ai encore besoins de vous

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    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 715
    Points : 5 394
    Points
    5 394
    Par défaut
    Citation Envoyé par Nicoludique Voir le message
    1 h à coder 3 jours a déboguer c' est pas rentable

    c'est le métier qui rentre!

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Une moitié de bonne idée
    Finalement le résultat n'est pas à la hauteur de mes espérances. La palette de couleurs RVB correspond correctement à une application pour un périphérique de type écran mais pas du tout à un ruban led car un RVB(0,0,0) donne du noir sur un écran mais correspond à un ruban led éteint et non un ruban noir. En d'autres termes RVB(128,0,0) ne donne pas du bordeau mais juste du rouge à la moitié de la puissance maxi de la led rouge. Donc toute la liste de couleur nommée de mon fichier ini ne correspond en rien à la couleur diffusé par le ruban led. Décevant. 😐

  13. #13
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    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 715
    Points : 5 394
    Points
    5 394
    Par défaut
    Citation Envoyé par Nicoludique Voir le message
    un RVB(0,0,0) donne du noir sur un écran mais correspond à un ruban led éteint et non un ruban noir.
    Pas sûr de comprendre : sur un écran on est en additif, si vous choisissez 0 pour les 3 composantes, vous avez aussi un pixel éteint, comme sur le bandeau LED.

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2022
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Effectivement
    De fait vous avez raison nous sommes là en additif et le gain sur chacun des canaux tend vers le blanc mais le rendu visuel n'est pas le même. Je m' explique : si vous appliquez 128 au rouge et 0 pour les 2 autres, sur un écran vous obtenez du rouge sombre alors que sur le ruban vous obtenez une led rouge vif moitié moins brillante. Ou encore mieux si tout est à 0 alors noir sur l' écran et pas de luminosité sur le ruban. Donc visuellement la couleur indiqué dans le fichier ini ne correspond pas à ce que l'on voit physiquement sur le ruban. Ce qui paraît normal à posteriori, il faut juste que je trouve une liste nommée de couleur RGB qui puisse être appliqué à un ruban led RGB 😊

  15. #15
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 715
    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 715
    Points : 5 394
    Points
    5 394
    Par défaut
    oui, c'est parce que le fond des écrans est noir et qu'il y a une grille qui empêche la luminosité voisine de venir baver sur les pixels éteints. donc sous le rouge à 50% il y a du noir ce qui fait ce rouge sombre et la taille du pixel est petite.

    Ce n'est pas le cas sur un bandeau de LED (le support est souvent blanc - ils existent en noir) et les trois couleurs primaires sont assez "imposantes"...

    Les joies de la calibration et de la colorimétrie

Discussions similaires

  1. Sauvegarde des attributs de texte en fichier ini
    Par Raylemon dans le forum Langage
    Réponses: 2
    Dernier message: 06/09/2003, 21h28
  2. Lecture et ecriture fichier .ini
    Par despe dans le forum C
    Réponses: 6
    Dernier message: 23/07/2003, 20h40
  3. Fichiers INI et TlistBox
    Par Philippe01 dans le forum Langage
    Réponses: 3
    Dernier message: 11/06/2003, 15h36
  4. [VB6] Api pour supprimer dans un fichier INI
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 20/02/2003, 08h16
  5. faire un fichier .ini
    Par florent dans le forum C++Builder
    Réponses: 14
    Dernier message: 31/05/2002, 22h06

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