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

 C++ Discussion :

Carte SD - Config.txt


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut Carte SD - Config.txt
    Bonjour,

    Je suis en train d'essayer, me blâmer, de comprendre comment je pourraît interagir avec une carte SD sur une carte électronique. Arduino, et son shiend éthernet. Mais bon, c'est pour l'indication que je le met, plus que pour servir de point de départ !

    Avec le site du constructeur, je suis arrivé à tester si la carte était présente, si elle avait bien un fichier. J'ai séparer ça dans des fonctions afin d'alléger l'initialisation qui deviendrais vraiment trop importante et qui nécessitais que l'on face ainsi pour le dépannage futur.

    Au niveau des librairie, j'utilise la librairie SD.h expliqué en parti ici. Et enfin un exemple concret mais qui ne ressemble ni à mon code final ni à ce que je veux faire au final. Exemple.

    Je vais essayer de synthétiser mon code, afin de ne mettre que ce qui concerne le fonctionnement de la carte SD et l'affichage LCD qui fonctionne
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
     
    /*
      Télécommande sur 433 Mhz bi-directionnelle
      ------------------------------------------
      
      Création : le 29 octobre 2012
      Version 1.0
      ------------------------------------------
      
                Pins utilisés
      TX1 -> Modem 433Mhz
      RX1 <- Modem 433Mhz
      SDA <-> Data I2C
      SCL <-> Horloge I2C
      
      SPI <-> Carte Ethernet / SD Card
      04 (PWM) -> Ethernet CS
      
      10 (PWM) -> Ethernet Librairie
      50 (Digit) -> Ethernet Librairie
      51 (Digit) -> Ethernet Librairie
      52 (Digit) -> Ethernet Librairie
      53 (Digit) -> Ethernet Librairie
      
      AN0 -> Voie 1
      AN1 -> Voie 2
      AN2 -> Voie 3
      AN3 -> Voie 4
      
      22 (Digit) -> Voie 5 = Btn On/Off/On 1
      23 (Digit) -> Voie 5 = Btn On/Off/On 1
      24 (Digit) -> Voie 6 = Btn On/Off/On 2
      25 (Digit) -> Voie 6 = Btn On/Off/On 2
      
      Pour infos:
      - Les voies analogiques sont reliée chacune à leur potar.
      
      - 22 et 23 Corresponde à un potar à 3 positions.
      - 00 = Milieu
      - 10 = Haut
      - 01 = Bas
      
      - 24 et 25 Corresponde à un potar à 3 positions.
      - 00 = Milieu
      - 10 = Haut
      - 01 = Bas
      
    */
     
    /* INC */
    #include <Wire.h>
    #include <SD.h>
     
    /* DEFINITIONS */
    #define adresseLcd 0x63  //Ecran LCD
     
    /* VARIABLES GLOBALES */
    File myFile;
     
    /* SETUP */
    void setup() {
     
      //Lancer les ports séries
      Serial.begin(9600);  //Pour dépanner sur le port USB
      Serial1.begin(9600); //Pour gérer le modem
     
      //Initialiser l'écran LCD
      initLcd();  //Initialiser l'écran LCD
      ecrireLcd("Telecommande 433Mhz", 01);  //Ecrire
      ecrireLcd("Version 1.0", 24);  //Ecrire
      ecrireLcd("Bonjour", 66);  //Ecrire
     
      delay(2000);
     
      //Initialiser la carte SD
      if(initSD()) {
        testFichier("config.txt");
      }
     
      clearLcd();  //Effacer l'écran
    }
     
    /* LOOP */
    void loop() {
    }
     
    /* FONCTION initLCD */
    void initLcd() {
     
      //Initialisation de l'écran par I2C
      Wire.begin();  //Amorce la connection sur SDA et SCL
      Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
      Wire.write((byte)0x00);  //Assigne un null
      Wire.write((byte)0x0C);  //Effacer l'écran
      Wire.write((byte)0x13);  //Allume le rétro-éclairage
      Wire.write((byte)0x04);  //Ne pas afficher le curseur
      Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION ecrireLcd */
    void ecrireLcd(String texte, int positionEcran) {
     
      //Initialisation de l'écran par I2C
      Wire.begin();  //Amorce la connection sur SDA et SCL
      Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
      Wire.write((byte)0x00);  //Assigne un null
      Wire.write((byte)0x02);  //Placer le curseur
      Wire.write(positionEcran);  //Sur l'écran
      Wire.print(texte);  //Ecrire un texte
      Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION ecrireLcdChar */
    void ecrireLcdChar(char texte[32], int positionEcran) {
     
      //Initialisation de l'écran par I2C
      Wire.begin();  //Amorce la connection sur SDA et SCL
      Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
      Wire.write((byte)0x00);  //Assigne un null
      Wire.write((byte)0x02);  //Placer le curseur
      Wire.write(positionEcran);  //Sur l'écran
      Wire.write(texte);  //Ecrire un texte
      Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION clearLcd() */
    void clearLcd() {
     
      //Initialisation de l'écran par I2C
      Wire.begin();  //Amorce la connection sur SDA et SCL
      Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD
      Wire.write((byte)0x00);  //Assigne un null
      Wire.write((byte)0x0C);  //Effacer l'écran
      Wire.endTransmission();  //Ferme la connexion sur SDA et SCL
    }
     
    /* FONCTION initSD() */
    boolean initSD() {
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card...", 01);  //Ecrire
     
      //Si la carte n'est pas présente ou qu'elle est en défaut
      if(!SD.begin(4)) {
     
        //Afficher l'écran LCD
        clearLcd();  //Effacer l'écran
        ecrireLcd("Init SD Card failed", 01);  //Ecrire
        delay(1000);
        return false;
      }
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init SD Card done", 01);  //Ecrire
     
      delay(1000);
      return true;
    }
     
    /* FONCTION testFichier(fichier) */
    void testFichier(char fic[]) {
     
      clearLcd();  //Effacer l'écran
      ecrireLcd("Init File in SD...", 01);  //Ecrire
     
      //Ouvrir le fichier
      myFile = SD.open(fic, FILE_READ);
     
      //Si le fichier n'est pas présent
      if(myFile == false) {
     
        clearLcd();  //Effacer l'écran
        ecrireLcd("SD: File not found", 01);  //Ecrire
     
        /*
          peut tre remplacer par une demande d'apuie
          de bouton Valider pour passer à l'utilisation de la télécommande
        */
     
        for(;;); //Boucle infini
      }
     
      clearLcd();  //Effacer l'écran
     
      ecrireLcd("File in SD done", 01);  //Ecrire
     
      delay(1000);
    }
     
    /* FONCTION de lecture des configurations */
    void lectureConf() {
     
     
    }
    Maintenant, je vais vous parler des configurations. Dans ma télécommande, je peux "true" ou "false" autoriser des mixages de voies. Donc on écrit pas 0 ou 1 mais bien true ou false. Ça c'est pour ma petite convention.

    Ensuite, j'admet tout type de données. Texte, Chiffre, Byte, Binaire, Exadécimale...

    Chaque modèles à sa propre ligne. Ainsi, si je dois gérer plusieurs modèles, il me faudra faire un fichier écrit de la façon suivante:
    MODELE-01,Nom,Type,Conf1,Conf2,Conf3,Conf4...
    soit:
    MODELE-01,Robot Go,Robot,true,false,false,false...
    MODELE-02,Minimog 02,Sous-marin,true,true,false,false...
    MODELE-03,G-Bot,Robot,false,false,true,false...
    DERNIER-MODELE,MODELE-02

    Il faut bien sûr que j'implémente un switching sur MODELE-xx. Ceci permettant de passer d'un modèle à l'autre sans rebooter la télécommande. A voir plus tard.

    Il faut aussi que je puisse récupérer chaque valeurs, sauf la première dans un tableau, sachant que la limite de longueur est un "\n".

    Et enfin, il faut que je puisse modifier un true pour un false, ainsi de suite.

    Donc ma première question, comment je pourrait écrire une petite fonction qui lise les modèles présent ? (Attention, DERNIER-MODELE,MODELE-02 est là pour pas changer de modèle à chaque redémarrage et donc, il faut le décompter des modèles à récupérer).

    Pour moi qui suis débutant, je galère pas mal. J'insiste donc sur votre indulgence. Je reste ouvert s'il y a moyen de simplifier un peu dans mes fonctions.

    Merci de votre patience.

  2. #2
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Bonjour,

    Hier j'ai un tout petit peu avancer avec un début de fonction.

    J'ai essayer de créer lectureConf().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* FONCTION de lecture des configurations */
    String lectureConf() {
     
      while(myFile.available()) {
     
        Serial.write(myFile.read());
      }
    }
    Je retourne bien le contenu de ma carte en brut. Ok !

    Je pense m'orienter comme suit. Au démarrage, on va lire le nombre de ligne avec lectureConf_NB(). Ici, dans mon exemple je vais stocker 3 modèles d'ont la dernière ligne sera la mémorisation de l'état de la radio à son instinction. Ici donc 4 lignes, le programme me retournera n-1.

    Il me suffira donc de créer une seconde fonction lectureConf_LN(int ligne) qui retournera un tableau de valeurs et qui correspondra à la ligne choisi. Ainsi, si je démarre ma radio, j'irais en ligne n+1 puis je récupérerais tout les états de la radio.

    Donc je pense modifier ma fonction en haut mais maintenant je cherche un morceau de code pour lire le nombre de ligne. Déjà j'aurais avancer d'un grand pas.

    Si possible, avec quelques commentaires afin que je m'en inspire pour que je comprenne.

    Merci une nouvelle fois de votre patience et de votre aide

  3. #3
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Bon alors, du coup, en me faisant un peu aider tout de même. J'ai fait ce qui suit et qui fonctionne parfaitement
    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
     
    /* FONCTION qui retournera le nombre de ligne du fichier */
    int lectureConf_NB() {
     
     
      int nb=0;
     
      //Parcourir le fichier jusqu'à un caractère null
      while(myFile.available()) {
     
        //Si il est rencontrer un saut de ligne
        if(myFile.read() == '\n') {
     
          //Compter
          nb++;
        }
      }
     
      //Retourner le nombre de lignes parcouru
      return nb;
    }
    Maintenant je me consacre à la suite de mon programme. Pour ce faire, je pense m'appuyé sur cet algo:
    //lectureConf_LN(int ligne_a_lire)
    //aller à la ligne_a_lire
    //parcourir la ligne jusqu'au saut de ligne
    //Parser le contenu sur les ',' le dernier caractère étant le saut de ligne
    //Charger le tableau de string avec les valeurs parsés
    //Fin de parcours
    //Return tableau
    Sachant que j'ai dan mon fichier.txt:
    MODELE-01,Robot Go,Robot,true,false,false,false
    MODELE-02,Minimog 02,Soum,false,false,false,false
    MODELE-03,G-Bot,Robot,false,false,false,false
    Et que j'aimerais avoir un tableau de String du type:
    tableau[0]=MODELE-01
    tableau[1]=Robot Go
    tableau[2]=Robot
    tableau[3]=true
    tableau[4]=false
    tableau[5]=false
    tableau[6]=false
    Du coup, je m'interroge aussi sur ça:
    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
     
    boolean Mix_V1V2 = false;
     
    //Charger la configuration
    Mix_V1V2 = tableau[3];
     
    //Si le mixage Voie 1 avec Voie 2 est activé
      if(Mix_V1V2) {
        //Mixage voie 1 et voie 2
        mixVoie1 = abs(voies[1] - (voies[2]-90)); 
        mixVoie2 = abs(voies[1] + (voies[2]-90));
     
        //Réécrire les voies avec le mixage
        voies[1] = mixVoie1;
        voies[2] = mixVoie2;
      }
    Sachant que le but est de reprendre la configuration de chaque modèle.

    Donc place à la question. Comment aller en ligne n sachant qu'après il faudra parser ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    le plus simple si ton fichier est aussi court serait probablement de le placer en mémoire en le lisant une bonne fois pour toutes dans une string, puis de travailler avec cette string.
    En plaçant le fichier en mémoire, tu peux aussi utiliser tous les algorithmes STL, à commencer par count.

    Sinon, il te faut enregistrer l'offset du début de chaque ligne pour t'y référer, un simple vector peut faire l'affaire. Puis déplacer le curseur de lecture au bon endroit.

    A savoir que ton algo ne me parait pas correct. Que se passe-t-il si un fichier a une seule et unique ligne ? Il retourne 0. De manière générale, le nombre de lignes lues n'est pas correct, il est décrémenté de 1.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    Pour le moment, effectivement, c'est un fichier court.

    Par contre plus tard, ce fichier sera beaucoup plus lourd et prendre plus de paramètres.

    Je suis bien d'accord avec toi sur l'idée de tout charger mais bonjour les temps de démarrage et de fonctionnement.

    Une solution moins facile à mon goût est de faire un fichier par modèles. Si j'ai 150 modèles, j'ai 150 fichiers

    Sérieusement, c'est pas aussi simple que ça le développement en embarqué ! On a pas autant de ram que dans un PC et les méthodes conventionnelles nous sont contraire.

    Donc maintenant, j'avais trouvé une solution facile permettant de ne pas cherché au delà du nombre de ligne déjà entré. Après, si tu a une meilleure solution, je n'ai rien contre il n'est pas trop tard dans mon code.

    Retiens alors que si je fais un fichier par modèle, je dois impérativement compter le nombre de modèles et de plus je modifierais sa structure pour:
    Nom=Nom
    Type=Type
    Option1=true
    Option2=false
    Option3=false
    Option4=false

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    bonjour les temps de démarrage et de fonctionnement.
    On a pas autant de ram que dans un PC
    Tu parles de temps de chargement et fonctionnement mais
    - tu liras toujours plus vite en ram qu'un fichier
    - c'est uniquement au chargement, après ça tu ne l'utilises plus et ne prends plus de place en mémoire : la mémoire ça se libère
    - ça n'a aucune incidence sur le fonctionnement si c'est purement du setup : c'est libéré immédiatement après

    Si tu gardes le fichier uniquement
    - déjà tu lis le fichier caractère par caractère pour compter les \n
    - ensuite tu dois relire le fichier depuis le début pour recompter les \n et t'arrêter à celui qui t'intéresse et atteindre la ligne
    - enfin tu parses le contenu

    Dans tous les cas, l'utilisation d'un vector pour indexer l'offset du début de chaque ligne me parait (plus qu') intéressant.

    Donc maintenant, j'avais trouvé une solution facile permettant de ne pas cherché au delà du nombre de ligne déjà entré.
    Je n'ai pas compris.

    Retiens alors que si je fais un fichier par modèle, je dois impérativement compter le nombre de modèles et de plus je modifierais sa structure pour:
    Tu as peut-être des méthodes disponibles pour lister/compter les fichiers d'un répertoire, et en choisissant une arborescence et nomenclature correcte tu peux très simplement
    - savoir le nombre de modèles
    - ouvrir le modèle correspondant
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Config carte reseau ethernet 10/100
    Par toto_titi dans le forum Réseau
    Réponses: 9
    Dernier message: 08/02/2012, 17h57
  2. [Evolution de Config] Ajout d'une carte graphique.
    Par Maxoo dans le forum Ordinateurs
    Réponses: 10
    Dernier message: 10/01/2008, 21h56
  3. Install/Config carte son
    Par lavazavio dans le forum Debian
    Réponses: 4
    Dernier message: 12/12/2007, 21h41
  4. [Config PC de joueur] [Carte son] Inutile ?
    Par Manopower dans le forum Composants
    Réponses: 7
    Dernier message: 26/09/2005, 17h13
  5. [C#] écriture fichier .txt + calcul écart-type
    Par titaB dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/05/2005, 13h09

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