{"id":2587,"date":"2020-04-17T11:27:54","date_gmt":"2020-04-17T09:27:54","guid":{"rendered":"http:\/\/www.ardpylab.fr\/?page_id=2587"},"modified":"2020-05-10T16:44:48","modified_gmt":"2020-05-10T14:44:48","slug":"conversion-des-donnees","status":"publish","type":"page","link":"https:\/\/www.ardpylab.fr\/?page_id=2587","title":{"rendered":"Conversion des donn\u00e9es"},"content":{"rendered":"\n<h2 style=\"text-align: center;\"><em><strong>(conversion d\u2019une chaine de <\/strong><\/em><em><strong>caract\u00e8res en nombre)<\/strong><\/em><\/h2>\n\n\n\n<p><br><br><\/p>\n<p>Dans les programmes pour Arduino, Il est souvent n\u00e9cessaire de convertir des chaines de caract\u00e8res en une variable repr\u00e9sentant un nombre entier ou \u00e0 virgule pour effectuer des calculs.<br><br><\/p>\n<h4><span style=\"color: #0000ff;\"><strong><a id=\"conv1\"><\/a>. <u>La fonction \u201datoi()\u201d<\/u><\/strong><\/span><\/h4>\n<p>Il existe, pour cela, trois fonctions <strong>\u201d<\/strong><strong>atoi()\u201d<\/strong>, <strong>\u201d<\/strong><strong>atol()\u201d<\/strong> et <strong>\u201d<\/strong><strong>atof()\u201d<\/strong>, permettant respectivement de transformer une chaine de caract\u00e8res en nombre entier court, en nombre entier long et en nombre \u00e0 virgule.<\/p>\n<p>Attention cependant, car par d\u00e9faut ces fonctions retournent une valeur nulle en cas d&rsquo;erreur (comme par exemple, si on essaye de convertir des lettres en nombre) et donc se pose le probl\u00e8me de savoir si la valeur retourn\u00e9e est bien un z\u00e9ro saisi ou un z\u00e9ro d\u2019erreur\u2026<\/p>\n<p>En application, le programme nomm\u00e9 <strong>\u201d<\/strong><strong><a href=\"https:\/\/www.ardpylab.fr\/downloads\/moniteur-serie\/atoi.zip\" data-wplink-url-error=\"true\">Atoi.ino<\/a>\u201d <\/strong>suivant, qui utilise la fonction <strong>\u201d<\/strong><strong>atoi()\u201d<\/strong>&nbsp;permet de r\u00e9gler la luminosit\u00e9 de la DEL rouge du circuit pr\u00e9c\u00e9dant, en retour d\u2019une chaine de caract\u00e8res envoy\u00e9 depuis le moniteur s\u00e9rie dont la conversion en nombre entier doit \u00eatre compris entre 1 et 255.<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/moniteur-serie\/codes\/ino\/Atoi\/Atoi.ino\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"828\" height=\"761\" class=\"wp-image-2588 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms21.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms21.png 828w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms21-300x276.png 300w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms21-768x706.png 768w\" sizes=\"auto, (max-width: 828px) 100vw, 828px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<p>On retrouve dans ce programme, la partie de code permettant de recevoir une chaine de caract\u00e8res depuis le port s\u00e9rie. La chaine est convertie en nombre entier avec la fonction \u00ab\u00a0<strong>atoi()<\/strong>\u00ab\u00a0. Si le r\u00e9sultat n\u2019est pas compris entre 1 et 255 (\u00ab\u00a0<strong>while(Luminosite&lt;1 || Luminosite&gt;255)<\/strong> \u00ab\u00a0<strong>)<\/strong>&nbsp; , l\u2019utilisateur doit saisir de nouveau, une valeur.<\/p>\n<p>Voici le r\u00e9sultat dans le moniteur s\u00e9rie&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"463\" height=\"129\" class=\"wp-image-2591 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms22.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms22.png 463w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms22-300x84.png 300w\" sizes=\"auto, (max-width: 463px) 100vw, 463px\" \/><\/figure>\n<\/div>\n<p>&nbsp;<\/p>\n\n\n\n<h4><strong><span style=\"color: #0000ff;\"><a id=\"conv2\"><\/a>. <u>La fonction \u201dsscanf()\u201d<\/u><\/span><\/strong><\/h4>\n<p>Une autre m\u00e9thode est d\u2019utiliser la fonction <strong>\u201d<\/strong><strong>sscanf()\u201d<\/strong> qui permet de couper et de convertir une chaine de caract\u00e8res en une s\u00e9rie de variables allant du caract\u00e8re unique (type <strong>\u201d<\/strong><strong>char\u201d<\/strong>) au nombres d\u00e9cimaux (type <strong>\u201d<\/strong><strong>int\u201d<\/strong>, <strong>\u201d<\/strong><strong>float\u201d<\/strong>).<\/p>\n<p>Exemple de conversion une chaine de caract\u00e8res en variables (programme <strong>\u201d<a href=\"https:\/\/www.ardpylab.fr\/downloads\/moniteur-serie\/sscanf.zip\" data-wplink-url-error=\"true\">sscanf.ino<\/a>\u201d<\/strong> ) :<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/moniteur-serie\/codes\/ino\/sscanf\/sscanf.ino\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"764\" height=\"382\" class=\"wp-image-2594 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms23.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms23.png 764w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms23-300x150.png 300w\" sizes=\"auto, (max-width: 764px) 100vw, 764px\" \/><\/a><\/figure>\n<\/div>\n<p>Cet exemple permet d\u2019extraire le jour, le mois et l\u2019ann\u00e9e d\u2019une chaine de caract\u00e8re repr\u00e9sentant une date&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"560\" height=\"119\" class=\"wp-image-2595 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms24.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms24.png 560w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms24-300x64.png 300w\" sizes=\"auto, (max-width: 560px) 100vw, 560px\" \/><\/figure>\n<\/div>\n\n\n\n<p>&#8211; Le premier argument de la fonction est <strong>\u201d<\/strong><strong>str\u201d<\/strong>. Il repr\u00e9sente la chaine de caract\u00e8re \u00e0 convertir,<\/p>\n<p>&#8211; l\u2019argument <strong>\u201d<\/strong><strong>%d\u201d<\/strong>&nbsp;indique \u00e0 la fonction qu\u2019il faut extraire un nombre d\u00e9cimal,<\/p>\n<p>&#8211; l\u2019argument <strong>\u201d<\/strong><strong>%s\u201d <\/strong>pour extraire une chaine de caract\u00e8res (la fin de la chaine est rep\u00e9r\u00e9e par un espace, un saut de ligne),<\/p>\n<p>&#8211; les autres arguments sont les variables dans lesquelles il faut stocker les valeurs converties (les variables commen\u00e7ant par un <strong>\u201d<\/strong><strong>&amp;\u201d <\/strong>sont destin\u00e9es \u00e0 recevoir un nombre).<br><br><\/p>\n<p>La fonction <strong>\u201d<\/strong><strong>sscanf()\u201d<\/strong>&nbsp;retourne le nombre de variables qu\u2019elle a pu convertir, si cette valeur est diff\u00e9rente du nombre d&rsquo;arguments de conversion c&rsquo;est qu&rsquo;il y a eu une erreur.<\/p>\n<p>Ainsi, dans notre programme de r\u00e9glage de la luminosit\u00e9 de la DEL rouge (<strong><a href=\"https:\/\/www.ardpylab.fr\/downloads\/moniteur-serie\/atoi.zip\" data-wplink-url-error=\"true\">Atoi.ino<\/a>)<\/strong>, on peut remplacer la ligne :<\/p>\n\n\n\n<figure class=\"wp-block-table\">\n<table style=\"width: 100%; height: 21px;\">\n<tbody>\n<tr style=\"height: 21px;\">\n<td style=\"height: 21px; padding-left: 40px;\" bgcolor=\"#FFFFCC\">\n<p><span style=\"color: #000000;\">Luminosite = atoi(tampon);<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p>par :<\/p>\n\n\n\n<figure class=\"wp-block-table\">\n<table style=\"width: 100%; height: 21px;\">\n<tbody>\n<tr style=\"height: 21px;\">\n<td style=\"height: 21px; padding-left: 40px;\" bgcolor=\"#FFFFCC\">\n<p><span style=\"color: #000000;\">int N=0;<\/span><\/p>\n<p><span style=\"color: #000000;\">char c;<\/span><\/p>\n<p><span style=\"color: #000000;\">N = sscanf(tampon, \u00ab\u00a0%d %c\u00a0\u00bb, &amp;Luminosite, c);<\/span><\/p>\n<p><span style=\"color: #000000;\">if (N!=1){<\/span><\/p>\n<p><span style=\"color: #000000;\">&nbsp;&nbsp; &nbsp;&nbsp;Luminosite=0; }<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n\n\n\n<p>Avec ce code (programme <strong>\u201d<\/strong><strong><a href=\"https:\/\/www.ardpylab.fr\/downloads\/moniteur-serie\/sscanf2.zip\" data-wplink-url-error=\"true\">sscanf2.ino<\/a>\u201d<\/strong>) :<\/p>\n<p>&#8211; l\u2019argument <strong>\u201d<\/strong><strong>%c\u201d<\/strong>&nbsp;indique \u00e0 la fonction qu\u2019il faut extraire un caract\u00e8re,<\/p>\n<p>&#8211; si la chaine de caract\u00e8res <strong>\u201d<\/strong><strong>tampon\u201d <\/strong>repr\u00e9sente uniquement un nombre entier d\u00e9cimal, celle-ci est convertie et le nombre est stock\u00e9 dans la variable \u201dLuminosit\u00e9\u201d (dans ce cas, N qui repr\u00e9sente le nombre de variables extraites par la fonction est \u00e9gal \u00e0 1)<strong>,<\/strong><\/p>\n<p>&#8211; si la chaine de caract\u00e8res ne contient pas de nombre entier d\u00e9cimal, mais uniquement des lettres, la variable <strong>\u201d<\/strong><strong>Luminosit\u00e9\u201d <\/strong>reste \u00e9gal \u00e0 0 (m\u00eame si dans ce cas aussi N=1 car la fonction a extrait le premier caract\u00e8re dans la variable <strong>\u201d<\/strong><strong>c\u201d<\/strong>) et la condition pour sortir de la boucle n\u2019est pas remplie,<\/p>\n<p>&#8211; et enfin si la chaine de caract\u00e8re est constitu\u00e9e d\u2019un nombre et de caract\u00e8res, on a alors <strong>N = 2<\/strong>, la variable <strong>\u201d<\/strong><strong>Luminosit\u00e9\u201d <\/strong>est r\u00e9initialis\u00e9e \u00e0 0 pour forcer l\u2019utilisateur \u00e0 saisir seulement un nombre d\u00e9cimal entier.<\/p>\n\n\n\n<p>&nbsp;<\/p>\n<h4><span style=\"color: #0000ff;\"><strong><a id=\"conv3\"><\/a>. <u>La fonction \u201dSerial.parseInt()\u201d<\/u><\/strong><\/span><\/h4>\n<p>Dans les m\u00e9thodes pr\u00e9c\u00e9dentes, les chaines de caract\u00e8res envoy\u00e9s depuis le moniteur s\u00e9rie sont dans un premier temps re\u00e7ue telles quelles par l\u2019Arduino puis sont converties en nombre si celles-ci le permettent.<\/p>\n<p>Il est \u00e9galement possible de convertir directement les chaines de caract\u00e8res en entier long avant la r\u00e9ception par l\u2019Arduino avec la fonction <strong>\u201d<\/strong><strong>parseInt()\u201d<\/strong> de la classe <strong>\u201d<\/strong><strong>Serial\u201d<\/strong><\/p>\n<p>Cette fonction retourne le premier entier long du tampon de la liaison s\u00e9rie. Les caract\u00e8res lettres ou le signe <strong>\u201d<\/strong><strong>-\u201d <\/strong>sont ignor\u00e9s. Au-del\u00e0, d\u2019un certain temps (par d\u00e9faut, 1 s), la fonction se termine et retourne <strong>\u00ab\u00a00\u00a0\u00bb<\/strong>. Le temps d\u2019attente pour recevoir les donn\u00e9es peut \u00eatre r\u00e9gl\u00e9 avec la fonction <strong>\u201d<\/strong><strong>setTimeout()\u201d<\/strong>&nbsp;en ms.<\/p>\n<p>Le code de notre programme de r\u00e9glage de la luminosit\u00e9 de la DEL rouge devient alors (programme <strong>\u201d<a href=\"https:\/\/www.ardpylab.fr\/downloads\/moniteur-serie\/parseint.zip\" data-wplink-url-error=\"true\">Parseint.ino<\/a>\u201d<\/strong>):<\/p>\n\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.ardpylab.fr\/downloads\/moniteur-serie\/codes\/ino\/Parseint\/Parseint.ino\" data-wplink-url-error=\"true\"><img loading=\"lazy\" decoding=\"async\" width=\"832\" height=\"514\" class=\"wp-image-2602 aligncenter\" style=\"border: 3px solid #eeeeee; padding: 3px; margin: 3px;\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms25.png\" alt=\"\" srcset=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms25.png 832w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms25-300x185.png 300w, https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/04\/com-ardpy-ms25-768x474.png 768w\" sizes=\"auto, (max-width: 832px) 100vw, 832px\" \/><\/a><\/figure>\n<\/div>\n<p>&nbsp;<\/p>\n\n\n\n<p>Avec cette m\u00e9thode, une chaine de caract\u00e8res envoy\u00e9s depuis le moniteur s\u00e9rie contenant un nombre et du texte est consid\u00e9r\u00e9e comme valide. Les caract\u00e8res repr\u00e9sentant du texte sont juste ignor\u00e9s.<\/p>\n<p>Si la chaine ne contient que du texte, la fonction <strong>\u00ab\u00a0Serial.parseInt()\u00a0\u00bb<\/strong> retourne <strong>\u00ab\u00a00\u00a0\u00bb (Luminosite = 0)<\/strong> et la condition pour sortir de la boucle n\u2019est pas remplie.<\/p>\n<p>\u00a0<\/p>\n\n\n<div  class=\"grids-section grids-is-stretch\" style=\"--_gs-gap-desktop:0px 0px;--_gs-m-desktop:0 0 0 0;--_gs-p-desktop:0 0 0 0;--_gs-bg-desktop:transparent none;--_gs-bg-xp-desktop:0px;--_gs-zi-desktop:auto;--_gs-d-desktop:block;--_gs-mw-desktop:calc(100% - 0 - 0);--_gs-gap-tablet:0px 0px;--_gs-m-tablet:0 0 0 0;--_gs-p-tablet:0 0 0 0;--_gs-bg-tablet:transparent none;--_gs-bg-xp-tablet:0px;--_gs-zi-tablet:auto;--_gs-d-tablet:block;--_gs-mw-tablet:calc(100% - 0 - 0);--_gs-gap-mobile:0px 0px;--_gs-m-mobile:0 0 0 0;--_gs-p-mobile:0 0 0 0;--_gs-bg-mobile:transparent none;--_gs-bg-xp-mobile:0px;--_gs-zi-mobile:auto;--_gs-d-mobile:block;--_gs-mw-mobile:calc(100% - 0 - 0);--_gs-columns:2;--_gs-rows:1\"><div class=\"grids-s-w_i\">\n<div class=\"grids-area\" style=\"--_ga-column:1\/2;--_ga-row:1\/2;--_ga-m-desktop:0 0 0 0;--_ga-p-desktop:0 0 0 0;--_ga-bg-desktop:transparent none;--_ga-zi-desktop:auto;--_ga-d-desktop:flex;--_ga-mw-desktop:calc(100% - 0 - 0);--_ga-m-tablet:0 0 0 0;--_ga-p-tablet:0 0 0 0;--_ga-bg-tablet:transparent none;--_ga-zi-tablet:auto;--_ga-d-tablet:flex;--_ga-mw-tablet:calc(100% - 0 - 0);--_ga-m-mobile:0 0 0 0;--_ga-p-mobile:0 0 0 0;--_ga-bg-mobile:transparent none;--_ga-zi-mobile:auto;--_ga-d-mobile:flex;--_ga-mw-mobile:calc(100% - 0 - 0)\">\n\n<div class=\"wp-block-image\"><figure class=\"alignleft size-large\"><a href=\"https:\/\/www.ardpylab.fr\/?page_id=2522\"><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"28\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/03\/moins.jpg\" alt=\"\" class=\"wp-image-107\"\/><\/a><\/figure><\/div>\n\n<\/div>\n\n<div class=\"grids-area\" style=\"--_ga-column:2\/3;--_ga-row:1\/2;--_ga-m-desktop:0 0 0 0;--_ga-p-desktop:0 0 0 0;--_ga-bg-desktop:transparent none;--_ga-zi-desktop:auto;--_ga-d-desktop:flex;--_ga-mw-desktop:calc(100% - 0 - 0);--_ga-m-tablet:0 0 0 0;--_ga-p-tablet:0 0 0 0;--_ga-bg-tablet:transparent none;--_ga-zi-tablet:auto;--_ga-d-tablet:flex;--_ga-mw-tablet:calc(100% - 0 - 0);--_ga-m-mobile:0 0 0 0;--_ga-p-mobile:0 0 0 0;--_ga-bg-mobile:transparent none;--_ga-zi-mobile:auto;--_ga-d-mobile:flex;--_ga-mw-mobile:calc(100% - 0 - 0)\">\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-large\"><a href=\"https:\/\/www.ardpylab.fr\/?page_id=2613\"><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"28\" src=\"https:\/\/www.ardpylab.fr\/wp-content\/uploads\/2020\/03\/plus.jpg\" alt=\"\" class=\"wp-image-106\"\/><\/a><\/figure><\/div>\n\n<\/div>\n<\/div><\/div>\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>(conversion d\u2019une chaine de caract\u00e8res en nombre) Dans les programmes pour Arduino, Il est souvent n\u00e9cessaire de convertir des chaines de caract\u00e8res en une variable repr\u00e9sentant un nombre entier ou \u00e0 virgule pour effectuer des calculs. . La fonction \u201datoi()\u201d Il existe, pour cela, trois fonctions \u201datoi()\u201d, \u201datol()\u201d et \u201datof()\u201d, permettant respectivement de transformer une [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2587","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2587","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2587"}],"version-history":[{"count":0,"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=\/wp\/v2\/pages\/2587\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.ardpylab.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2587"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}