Conversion des données

(conversion d’une chaine de caractères en nombre)



Dans les programmes pour Arduino, Il est souvent nécessaire de convertir des chaines de caractères en une variable représentant un nombre entier ou à virgule pour effectuer des calculs.

. La fonction ”atoi()”

Il existe, pour cela, trois fonctions atoi()”, atol()” et atof()”, permettant respectivement de transformer une chaine de caractères en nombre entier court, en nombre entier long et en nombre à virgule.

Attention cependant, car par défaut ces fonctions retournent une valeur nulle en cas d’erreur (comme par exemple, si on essaye de convertir des lettres en nombre) et donc se pose le problème de savoir si la valeur retournée est bien un zéro saisi ou un zéro d’erreur…

En application, le programme nommé Atoi.inosuivant, qui utilise la fonction atoi()” permet de régler la luminosité de la DEL rouge du circuit précédant, en retour d’une chaine de caractères envoyé depuis le moniteur série dont la conversion en nombre entier doit être compris entre 1 et 255.

On retrouve dans ce programme, la partie de code permettant de recevoir une chaine de caractères depuis le port série. La chaine est convertie en nombre entier avec la fonction « atoi()« . Si le résultat n’est pas compris entre 1 et 255 (« while(Luminosite<1 || Luminosite>255) « )  , l’utilisateur doit saisir de nouveau, une valeur.

Voici le résultat dans le moniteur série :

 

. La fonction ”sscanf()”

Une autre méthode est d’utiliser la fonction sscanf()” qui permet de couper et de convertir une chaine de caractères en une série de variables allant du caractère unique (type char”) au nombres décimaux (type int”, float”).

Exemple de conversion une chaine de caractères en variables (programme sscanf.ino ) :

Cet exemple permet d’extraire le jour, le mois et l’année d’une chaine de caractère représentant une date :

– Le premier argument de la fonction est str”. Il représente la chaine de caractère à convertir,

– l’argument %d” indique à la fonction qu’il faut extraire un nombre décimal,

– l’argument %s” pour extraire une chaine de caractères (la fin de la chaine est repérée par un espace, un saut de ligne),

– les autres arguments sont les variables dans lesquelles il faut stocker les valeurs converties (les variables commençant par un &” sont destinées à recevoir un nombre).

La fonction sscanf()” retourne le nombre de variables qu’elle a pu convertir, si cette valeur est différente du nombre d’arguments de conversion c’est qu’il y a eu une erreur.

Ainsi, dans notre programme de réglage de la luminosité de la DEL rouge (Atoi.ino), on peut remplacer la ligne :

Luminosite = atoi(tampon);

par :

int N=0;

char c;

N = sscanf(tampon, « %d %c », &Luminosite, c);

if (N!=1){

     Luminosite=0; }

Avec ce code (programme sscanf2.ino) :

– l’argument %c” indique à la fonction qu’il faut extraire un caractère,

– si la chaine de caractères tampon” représente uniquement un nombre entier décimal, celle-ci est convertie et le nombre est stocké dans la variable ”Luminosité” (dans ce cas, N qui représente le nombre de variables extraites par la fonction est égal à 1),

– si la chaine de caractères ne contient pas de nombre entier décimal, mais uniquement des lettres, la variable Luminosité” reste égal à 0 (même si dans ce cas aussi N=1 car la fonction a extrait le premier caractère dans la variable c”) et la condition pour sortir de la boucle n’est pas remplie,

– et enfin si la chaine de caractère est constituée d’un nombre et de caractères, on a alors N = 2, la variable Luminosité” est réinitialisée à 0 pour forcer l’utilisateur à saisir seulement un nombre décimal entier.

 

. La fonction ”Serial.parseInt()”

Dans les méthodes précédentes, les chaines de caractères envoyés depuis le moniteur série sont dans un premier temps reçue telles quelles par l’Arduino puis sont converties en nombre si celles-ci le permettent.

Il est également possible de convertir directement les chaines de caractères en entier long avant la réception par l’Arduino avec la fonction parseInt()” de la classe Serial”

Cette fonction retourne le premier entier long du tampon de la liaison série. Les caractères lettres ou le signe -” sont ignorés. Au-delà, d’un certain temps (par défaut, 1 s), la fonction se termine et retourne « 0 ». Le temps d’attente pour recevoir les données peut être réglé avec la fonction setTimeout()” en ms.

Le code de notre programme de réglage de la luminosité de la DEL rouge devient alors (programme Parseint.ino):

 

Avec cette méthode, une chaine de caractères envoyés depuis le moniteur série contenant un nombre et du texte est considérée comme valide. Les caractères représentant du texte sont juste ignorés.

Si la chaine ne contient que du texte, la fonction « Serial.parseInt() » retourne « 0 » (Luminosite = 0) et la condition pour sortir de la boucle n’est pas remplie.