Go Down

Topic: Problème de String (Read 210 times) previous topic - next topic

clemclem25

Bonjour, voici mon petit problème :

Je dois connecter mon NodeMCU à ma base de donnée sur le site Firebase. J'utilise donc une bibliotèque me permettant de faire des Get, Set, Erase ....

Sauf que le Path que je met dans Firebase.getInt('Path')  est une variable d'une trentaine de caractères. J'ai donc choisi d'utilisé une variable String pour utilisé cette chaine de caractère. Mais quand je met cette variable dans la fonction Get, je n'ai rien en retour, alors que si je met directement la chaine de caractère dans le code, ca marche.

Enfaite, je ne sais pas si j'utilise bien les variable string.

à noté que dans le moniteur série, quand je lui demande de m'affiché le UID, il maffiche la chaine de caractère que je lui ai envoyer ( normal quoi),

Puis il fait une deuxième ligne qui est vide. j'en ai déduit qui fait un tableau de chaine de caractère et qui a préparé la seconde ligne mais je sais pas comment gérer ca.

En esperant avoir été assez clair

Clément

Je vous met mon code Ci-dessous :
Code: [Select]

//déclaration des bibliotèques
    #include <FirebaseArduino.h>
    #include <ESP8266WiFi.h>
//Déclaration des Identifiants Firebase
    #define FIREBASE_HOST "XXXXXXXXX.firebaseio.com"
    #define FIREBASE_AUTH "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
//Déclaration des Identifiants WIFI   
    #define WIFI_SSID "XXXXXXXXXX"
    #define WIFI_PASSWORD "XXXXXXXXXX"
//Déclaration des variables   
    String UID;
    char aquisition;
    String commande;
//Initialisation
    void setup()
    {
        Serial.begin(9600);                      //Vitesse de Communication avec la carte Mega ou l'ordinateur
        delay(5000);                             //delay pour ouvrir le moniteur série
        WiFi.begin(WIFI_SSID, WIFI_PASSWORD);    //Connection au réseau WIFI
        Serial.print("connecting");             
        while (WiFi.status() != WL_CONNECTED)    //En attente de connection
                {   
                  Serial.print(".");   
                  delay(500);
                }   
        Serial.println();
        Serial.print("connected: ");             //Connection effectué
        Serial.println(WiFi.localIP());          //Adresse IP du microcontroleur
        Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);    //Connection à Firebase
    }
//Programme Exécuté   
    void loop()
    {
        while (Serial.available())  // Si réception de données sur le Port Série
                {
                    aquisition = Serial.read(); //Lecture de chaque caractère par une variable Char
                    UID = UID + aquisition;     //Qui retranscrit un à un les caractère à la variable String
                    delay(50);                  //Délais de réception de chaque caractère
                }   
        if(Serial.available() == 0 && UID != 0) //Quand Reception terminé
                {
                  Serial.println(UID);              //Montré le UID
                  delay(200);
                  commande = Firebase.getInt(UID);  //Assigné à la String commande la valeur du Path UID
                  delay(200);
                  Serial.println(commande);         // Montré la variable commande
                  delay(200);
                  UID = "";                                  // Remise à zéro des String
                  commande = "";                    // Remise à zéro des String
                  Serial.println("clear");          // Annonce la fin de la boucle
                }
    }

dbrion06

JE vois beaucoup de choses qui me chagrinent:

*
 UID != 0) //Quand Reception terminé
 (UID est une String, je ne comprends pas toutes les subtilités)

* votre test de reception terminée et votre acquisition sur la ligne série sont bancaux...https://forum.arduino.cc/index.php?topic=500683.0


Quote
Puis il fait une deuxième ligne qui est vide
Une façon de cacher, en partie, ce comportement bancal est d'utiliser trim (IIRC UID.trim();) qui enlève les caractères invisibles assez sournois pour faire tourner en bourrique.(c'est pour ça qu'il faut manifester à visage découvert)

clemclem25

Bonjour,

UID != 0

Cela me permet de vérifié qu'il y a bien une valeur dans la variable.
Je n'est pas bien compris pourquoi cela vous chagrine car cette partie du code marche de mon coté.
Tant que UID n'est pas assigné à une valeur, la boucle if ne se lance pas.

dbrion06

"cette partie du code marche de mon coté."

oui, peut être, mais pour "mieux" boiter plus tard...
Lisez le tutoriel que je vous ai lié en post 2.

clemclem25

j'ai réessayé en rajoutant :
UID.trim();

juste après mon if et sa marche parfaitement.
merci beaucoup pour cette fonction que j'aurais jamais trouver tous seul.

dbrion06

Ca ne marche pas, ça boite:

que se passerait-il si votre terminal n'envoyait pas les caractères tout à la fois, validés par un \n? (il y a des emulateurs de terminal plus sophistiqués que celui d'arduino -hyper simple- , teraterm  envoye les caractères au fur et à mesure qu'on les tape , si on a activé cette fonctionnalité).

Que se passera-t-il si vous relisez votre code dans 6 mois, ayant acquis plus d'experience?
Le tutorial de JLM que j'ai lié permet de récupèrer proprement une chaîne de caractères, et de la traiter de façon stable....

lesept

#6
Apr 18, 2019, 02:40 pm Last Edit: Apr 18, 2019, 02:50 pm by lesept
Tu lis UID depuis la console, elle ajoute peut-être des caractères cachés à la fin (CR, LF, EOL...), il faudrait vérifier, par exemple en affichant les caractères qui le compose en hexa.

Edit. Au temps pour moi, trim le fait déjà
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

dbrion06

" elle ajoute peut-être des caractères cachés à la fin"
Avec une configuration classique, elle rajoute \r à la fin (qui est un caractère caché).
String.trim() les mange silencieusement.
Des consoles sophistiquées (sous windows, teraterm ou mieux -m'a-t-on dit- brayterminal) prmettent d'afficher la vakleur hexa de chaque caractère reçu si on le demande, de colorier, grasseyer, italiquer du texte, de  capturer dans un fichier: à un moment, on peut être tenté de les utiliser et d'abandonner la console d'arduino: un truc qui marche avec cette console peut très "bien" s'avérer calamiteux à therme)

lesept

Ci dessous le code de la méthode getInt: l'argument est déclaré en const, peut être que ça empêche de passer une variable et impose de passer un chemin entre guillemets.

Code: [Select]
int FirebaseArduino::getInt(const String& path) {
  getRequest(path);
  if (failed()) {
    return 0;
  }
  return FirebaseObject(req_.get()->response().c_str()).getInt();
}
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up