truc2geek

2014/09/02

Arduino : gérer des paramètres, part 4

Filed under: Arduino, Informatique, Programmation — Étiquettes : , , — truc2geek @ 04:07

A l’étape précédente, on a développé et testé le code permettant de gérer des paramères, sauf pour la validation qu’on laisse
encore de côté. Aujourd’hui, on va retravailler sur la modification de paramètres via le PC, pour la rendre « dynamique » :
au lieu de simplement déclencher des modifications de paramères fixées à l’avance, on pourra saisir sur le PC le code du
paramètre à modifier et sa nouvelle valeur.

Fonctionnement

Jusqu’à présent, on a saisi sur le moniteur série, uniquement des « instructions » d’un caractère : un chiffre, une lettre.
Maintenant on a besoin de transmettre trois informations :

  • le fait qu’on souhaite modifier la valeur d’un paramètre
  • le code de ce paramètre
  • la nouvelle valeur

Du côté de l’Arduino, on reçoit les caractères un par un.
Il faut donc définir une manière de délimiter la saisie : on va utiliser les caractères « < » et « > » pour signaler le début et la fin
d’une instruction.
Donc l’Arduino sait qu’une donnée commence avec le caractère « <« , et attendra de recevoir le caractère « > » pour l’interpréter.

Du coup, si dans l’instruction elle-même figure le caractère « < » ou « > », on l’échappe avec un slash : « /< » ou « /> ».
Si le caractère slash fait partie de l’instruction elle-même, il sera doublé : « // ».

Il nous faut aussi un caractère pour séparer les trois données qui composent l’instruction, prenons le point-virgule ; lui aussi
devra être échappé s’il fait partie de l’une des trois données.

Donc, une instruction aura le format suivant : « <Param;Code;Valeur> ».
Par exemple : « <param;ftp_motdepasse;456\ », pour attribuer la valeur « 456<789 » au paramètre « Ftp_MotDePasse ».

Pour garder la possibilité de déclencher les tests par l’intermédiaire de testSplitterChaine() et lancerTestParam(), on prévoit aussi de traiter les instructions au format « <test;a> ».

1e version

dev

On réécrit la fonction loop() de zéro :
01.png

Les deux variables etatChaineRecue et chaineRecue sont des variables globales :
03.png

Le principe est simple, on utilise 3 variables :

  • entree de type char, qui prend le caractère reçu
  • etatChaineRecue de type int, qui définit où on en est dans la réception d’une chaîne
  • chaineRecue, qui contient la chaîne

Les trois étapes sont les suivantes :

  • Au lancement de l’application, etatChaineRecue  vaut 0.
  • A partir du moment où on reçoit le caractère « <« , etatChaineRecue vaut 1, et on stocke les caractères reçus dans chaineRecue.
  • Quand on reçoit le caractère « > », on passe etatChaineRecue à 2, et donc le bloc d’instructions qui suit sera exécuté.

Ce bloc se contente d’appeler la fonction lireChaineRecue, puis réinitialise les variables globales, pour qu’on puisse
traiter les chaînes suivantes.

Voici le code de cette fonction :
02.png

La fonction setup() change un peu : on commente le code devenu inutile, on met juste un « oh yeah !! » pour la forme.

test

05.png

06.png

Les tests « a » et « b » fonctionnent, ok.

07.png

Le test « e » se passe bien ; on essaie « g » puis « h » pour modifier puis afficher le paramètre « Ftp_MotDePasse » :

08.png

Ok, on essaie les tests « f » puis « h » :

09.png

On essaie maintenant la nouvelle fonctionnalité ; on donne la valeur « Jupiter » au paramètre « Ftp_Hote »,
puis test « e » pour vérifier :

10.png

Ok!

Voici le lien vers les sources de cette version 1-3h de l’application.

2e version

1e modif : supprimer caractères « < » et « > »

Pour l’instant, la fonction loop() envoie à la fonction lireChaineRecue, la chaîne complète y compris les caractères de début
et de fin « < » et « > », qui servent simplement à délimiter la chaîne ; par exemple « <param;ftp_hote;jupiter> ».

Et le premier traitement effectué par la fonction lireChaineRecue, est de supprimer ces caractères :
14.png

Autant faire plus simple : dans la fonction loop, stocker les caractères utiles seulement :
à partir du caractères qui suit « < » et jusqu’au caractère qui précède « > ».

La fonction loop() devient :
15.png

Et la fonction lireChaineRecue() devient :
16.png

test :
17.png

Ok!

3e version : caractère d’échappement pour les caractères « < » et « > »

La version actuelle de l’application ne permet pas de traiter le cas où la chaîne contiendrait elle-même le caractère « < » ou « > », qui
sont utilisés pour délimiter la chaîne.

Il faut en tenir compte, en sachant que le caractère d’échappement, le slash, ne doit pas figurer dans la chaîne envoyée à la fonction lireChaineRecue s’il précède le caractère « < » ou « > ».
En effet, c’est la fonction loop() qui détermine où la chaîne commence et où elle finit, en fonction des caractères « < » et « > ».
C’est elle qui doit comprendre qu’un caractère « < » ou « > » précédé d’un slash doit être considéré comme faisant partie de la chaîne.
La fonction lireChaineRecue, elle, doit recevoir la chaîne, tout simplement.
Elle peut encore contenir des slashes, dans deux cas :

  • si elle contient un point-virgule qui fait partie de l’une des valeurs, il sera échappé pour ne pas être interprété comme un séparateur de valeurs.
  • si elle contient un slash, il faut le doubler tout simplement

On utilise une nouvelle variable globale, nommée « echappe » :
30.png

La fonction loop() évolue :
18.png

test :
19.png

Ok, le caractère « < » échappé est correctement interprété.
On a voulu donner au paramètre « Ftp_MotDePasse » la valeur « 1234<56 », c’est correct.

20.png

Idem avec le caractère « > » échappé, pour le mot de passe « 12>34 » : c’est traité comme attendu.

On essaie avec un point-virgule échappé :
21.png
22.png

23.png

La fonction loop() envoie la chaîne correctement traitée : le slash qui précède le point-virgule est encore présent, c’est ce
qu’on veut puisque c’est la fonction lireChaineRecue qui, en appelant splitterChaine, va découper la chaîne selon les
point-virgules. C’est donc elle qui doit savoir si un point-virgule est un séparateur ou s’il fait partie d’une valeur de la chaîne.

Note : la fonction loop() supprime aussi les slashes qui échappent un slash.

Par contre, le test « h » affiche comme valeur « 123/ ».
Ce n’est pas ce qu’on souhaite, il faut revoir la fonction splitterChaine() ; on ne l’a pas modifiée, elle ne prend pas en compte
le caractère d’échappement.

La fonction splitterChaine adaptée :
31.png
32.png

Test :

34.png

 

Ok!

Et un dernier test, avec deux slashes consécutifs, c’est simplement le caractère slash échappé :

35.png

36.png

 

Ok! Validé!

4e version, fonction F pour économiser la SRAM

Suite au problème de mémoire saturée rencontré dans l’article précédent, j’ai trouvé cette page, sur le « Playground » du site Arduino.

Sur la page de description de l’Arduino Uno, on voit entre autres que la Uno possède 32 KB de mémoire flash, 2 KB de mémoire SRAM et 1 KB de mémoire EEPROM.

Le bootloader utilise 0,5 KB de la mémoire flash, donc on en a 31,5 KB disponibles.

Pour savoir combien de place prendra notre application, la compiler :
11.png

Il restera environ 22 KB disponibles dans la mémoire flash.

Donc on va utiliser cette fonction F(), par contre voici un cas où c’est impossible :
28.png

Ici, on veut afficher une chaîne fixe suivie d’une variable : c’est la variable qui pose problème.
On ne peut utilsier cette fonction F qu’avec des chaînes de longueur fixe, et dont la taille est donc connue à la compilation.

Voici la nouvelle version de la fonction lireChaineRecue :
29.png

 Fin

Voici le lien vers la version 1.3i de l’application.
La validation des paramètres reste encore à développer.

Publicités

Laisser un commentaire »

Aucun commentaire pour l’instant.

RSS feed for comments on this post. TrackBack URI

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Créez un site Web ou un blog gratuitement sur WordPress.com.

%d blogueurs aiment cette page :