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 :

[ESP32] SPIFFS - Ecriture des fichiers - incompréhension


Sujet :

Arduino

  1. #1
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut [ESP32] SPIFFS - Ecriture des fichiers - incompréhension
    Bonjour à tous,
    Je butte sur une incompréhension de ma part, certainement sur le langage C++:
    Après avoir chargé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "FS.h"
    #include <SPIFFS.h>
    Je crée une routine d'écriture de fichier:
    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
    //***************** Ecriture SPIFFS **********************************
    void ecritureFichier(fs::FS &fs, const char *dir, const char *message){
      sBt.printf("Ecriture du fichier: %s\r\n", dir);
      File fic = fs.open(dir, FILE_WRITE);
      if(!fic){
        sBt.println("Pas de fichier");
        return;
      }
      if(fic.print(message)){
        sBt.println("Fichier ecrit");
      } else {
        sBt.println("Erreur d'ecriture");
      }
      fic.close();
    }
    puis pour y accéder j'ai une autre routine:
    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
    //*************Programmation alarme journalière par bluetooth**************
    void enregAlarmJour(char *al){
      if(!(al[2]==':' && al[5]=='-')){
        sBt.println(msg[3]);
        return;
      }
      hAlarmJ= (al[0]-ASCII0) * 10 + (al[1]-ASCII0);    //conversion ASCII en int
      mAlarmJ= (al[3]-ASCII0) * 10 + (al[4]-ASCII0);
      msgAlarmJ="";
      for(int i=6;i<LGMSG;i++){
        if(al[i]=='\n') break;
        msgAlarmJ += al[i];
      }
      msgAlarmJ.trim();
      char rep;
      do{
        sBt.println("Enregistrement ? O/N");
        while(!sBt.available()){}
        rep=sBt.read();
      }while(!(rep=='o' || rep=='O' || rep=='n' || rep=='N'));
      if(rep=='o' || rep=='O'){
        ecritureFichier(SPIFFS,"/AlarmJ.txt",al);
        delay(1000);
      }
    }
    Là j'obtiens un message positionné sur la contenu du fichier 'al' à l'appel de la procédure d'écriture:
    ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    Je ne comprends pas ce message. Pourquoi dans la fonction d'écriture la variable 'message' est déclarée 'const' ?

    Merci d'une aide
    Michel

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Note: ne postez pas des bouts de code et postez l'erreur complète, ça fait perdre du temps à tout le monde

    quel est le type de msgAlarmJ ? une instance de la classe String?

    ou est exactement le souci dans le code?

  3. #3
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut
    Merci de vous interessez à mon problème.

    Mon prog fait actuellement 600 lignes et le coeur de mon problème se situe sur ces bouts de code.
    msgAlarmJ est bien une instance de la classe String puisque je l'initialize à "" dans la routine; puis je lui applique la fonction .trim().
    Le soucis se situe sur l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecritureFichier(SPIFFS,"/AlarmJ.txt",al);
    sur la variable al.

    Par contre je viens de retenter une compilation; et sans rien modifier les erreurs ont disparues ??
    Je travaille sur VS Code et le seul message d'erreur que j'avais est celui affiché lorsque je positionne le curseur sur le soulignement d'erreur.

    De temps en temps VS Code a des réactions bizarres. Je viens de charger l'ESP32 et tout fonctionne correctement.

    Désolé mais je crois vous avoir alerté pour rien.

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    OK - juste par acquis de conscience, quand vous appeliez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void enregAlarmJour(char *al)
    est-ce que pour tester vous aviez mis un texte fixe, du genre enregAlarmJour("10:20 du texte"); ?

  5. #5
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut
    l'origine du message est là:
    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
    //*****************boucle principale****************
    void loop() {
      char tempo ;
      char commande[50];
      //****gestion des commandes Bluetooth****
      if(sBt.available()){
        tempo = sBt.read();                   //lit le premier caractère
        int i = 0;
        while(sBt.available()){
          commande[i] = sBt.read();           // lit la commande complète sans tempo
          i++;
        }
        if((tempo=='A' || tempo=='a')){       //commande d'affichage
          analyseComAffic(commande[0]);       //envoi la commande d'affichage
        }   
        else if(tempo=='F' || tempo=='f'){    //c'est une commande de fonction
          analyseComFct(commande);            //envoi la commande complète
          matrice.displayClear();
        }
        else {                                //erreur de commande
          sBt.println(commande);
          sBt.println(msg[0]);                //"cette commande n'existe pas"
        }
      }
      while(sBt.available()){tempo=sBt.read();}   //pour vider le buffer de sBt
      delay(50);
    puis là:
    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
    //*************** Analyse de la commande de fonction ************************
    void analyseComFct(char *codeRecu){
      char cd = codeRecu[0];        //commande de la fonction
      for(int i=1; i<LGMSG;i++){    //i=1 pour démarrer l'analyse après le cd
        if(codeRecu[i] == '\n'){
          break;    //si code reçu est un  NUL on sort de la boucle 
        }
        codeRecu[i-1] = codeRecu[i];    //décalage de 1 caractère pour éliminer la 'cd'
      }
      switch (cd){
        case 'S': case 's': ecritureFichier(SPIFFS,"/ssid.txt",codeRecu);
        break;
        case 'P': case 'p': ecritureFichier(SPIFFS,"/pass.txt",codeRecu);
        break;
        case 'H': case 'h': enregAlarmHebdo(codeRecu);        //format: Hhh:mm+J-'texte'   
        break;                                                //pour J dimanche=1, lundi=2, mardi=3, etc
        case 'O': case 'o': enregAlarmeOccas(codeRecu);       //format: Ohh:mm-'texte'
        break;
        case 'J': case 'j': enregAlarmJour(codeRecu);
        break;
        case 'B': case 'b': enregPub(codeRecu);
        break;
        default:
        break;
      }
    }
    Donc je ne viens pas d'un String mais de tableau de caractères.

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    ça ne m'en dit pas plus...


    pour revenir à ce point

    Citation Envoyé par mormic Voir le message
    Là j'obtiens un message positionné sur la contenu du fichier 'al' à l'appel de la procédure d'écriture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    Je ne comprends pas ce message. Pourquoi dans la fonction d'écriture la variable 'message' est déclarée 'const' ?

    on a ce message quand on passe une chaîne (string literal) du genre "Hello" à une fonction qui attend unchar * et pas un const char *. Une string literal est constant et donc ne peut être convertie en variable. Il en va de même si on utilise .c_str() sur une String puisque ça retourne un const char *.

    Vous aviez sans doute quelque chose comme cela qui trainait dans votre code

  7. #7
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut
    L'appel initial des procédures se fait en passant un char *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    analyseComFct(commande);
    puis toujours en char *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case 'J': case 'j': enregAlarmJour(codeRecu);
    enfin encore en char*
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecritureFichier(SPIFFS,"/AlarmJ.txt",al);
    et pour finir je devrais transmettre un const char *. Là je pourrais comprendre qu'il y a une erreur. Mais maintenant
    la compilation est bonne et pourtant c'est une variable que je transmets ??

    Pourquoi la routine d'écriture nécessite de mettre un const char * ?

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    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 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pourquoi la routine d'écriture nécessite de mettre un const char * ?
    quand on met const dans un paramètre pointeur dans une fonction, ça veut dire que la fonction ne touchera pas à sa valeur. Un truc variable peut toujours être catégorisé constant mais l'inverse n'est pas vrai.

    certaines fonctions cependant sont mal écrites et ont oublié de mettre le const, ce qui fait que si dans une fonction bien écrite (où vous avez mis const parce qu'il n'y a pas de modification) vous invoquez une fonction mal écrite qui attend un char * au lieu d'un const char *, alors vous aurez le message d'erreur

    C'est dommage que le compilateur n'ait pas été plus bavard sur le lieu du problème, l'important c'est que vous ne l'ayez plus (si vous pouvez faire une recompilation complète du projet peut-être que vous reverrez le message d'erreur)

  9. #9
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut
    Merci Jay M pour tous ces éclaircissements.
    Votre aide nous est toujours aussi précieuse pour mener à bien nos petits projets.
    Bien cordialement
    Michel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des erreurs lecture/ecriture des fichiers
    Par darkwalker dans le forum ANT
    Réponses: 1
    Dernier message: 07/07/2012, 18h56
  2. Ecriture des fichiers sous Vista
    Par franc82 dans le forum Administration système
    Réponses: 3
    Dernier message: 13/01/2008, 15h28
  3. Réponses: 2
    Dernier message: 06/08/2007, 13h54
  4. [CSV] Ecriture des données dans un fichier
    Par kagura dans le forum Langage
    Réponses: 3
    Dernier message: 07/11/2006, 22h55
  5. Réponses: 4
    Dernier message: 03/02/2006, 13h50

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