Go Down

Topic: Numérique vers chaine (Read 542 times) previous topic - next topic

Yves13011

Bonjour,
Je souhaiterai connaitre la fonction à appliquer pour passer d'une variable numérique à une variable chaine pour ensuite récupérer la valeur de cette chaine dans une application WINDEV.
ci dessous mes 2 variables en question dans le code ARDUINO :
unsigned long nb_tours_roue=0;        // variable nombre de tours de roue
char nb_tours_char[16];                // nombre de tours de roue en chaine

A+
Yves D.

fdufnews

#1
Dec 05, 2019, 02:24 pm Last Edit: Dec 05, 2019, 02:24 pm by fdufnews
Avec Serial.print() tu envoies des chaines de caractères. La transformation est réalisée par print directement.

Yves13011

Salut,
Merci pour ton intervention super rapide.
A priori avec :
Serial.print(nb_tours_char);        // envoi au port USB nombre de tours de roue
je ne récupère pas une chaine de caractère dans mon application WINDEV, c'est pour cela que je souhaiterai passer d'un entier à une chaine de caractère.
A+
Yves D.

fdufnews

Serial.print() émet une chaine ASCII. Il te suffit d'utiliser un soft d'émulation de terminal sur ton PC pour t'en convaincre.
Le problème est certainement ailleurs.
La chaine émise n'a pas de terminateur. Si tu veux qu'il y ait un terminateur il faut utiliser Serial.println().

Yves13011

Je vais revoir du coté de WINDEV pour la recuperation d'une chaine ASCII

lesept

#5
Dec 05, 2019, 06:44 pm Last Edit: Dec 05, 2019, 06:45 pm by lesept
Je ne connais pas l'aspect windev mais pour écrire un nombre dans une chaîne de caractères, l'instruction c'est sprintf ou snprintf.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Yves13011

Salut,
Le code ci dessous est il juste pour convertir la valeur numérique de "nb_tours_roue" en une chaine dans "nb_tours_char" et envoi sur la sortie serie.


unsigned long nb_tours_roue=0;        // variable nombre de tours de roue
char nb_tours_char[16];                // nombre de tours de roue en chaine

sprintf(nb_tours_char,"%lu",nb_tours_roue);
Serial.print(nb_tours_char);        // envoi au port USB nombre de tours de roue


A+
Yves D.

lesept

Ça devrait marcher, je ne connais pas les formats par coeur. Il faut essayer u, lu et voir ce que ça donne. La référence est ici
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Yves13011

Je vais tester pour voir ce que je récupère dans Windev, pour le moment j'arrive à extraire correctement les caractères de 0 à 9 et ensuite au delà de la valeur 9 c'est une suite de caractères indéchiffrables.
Si vous connaissez quelqu'un sur Marseille ou sa région qui pourrai m'aider concernant le code Arduino ce serai parfait.
Yves D.

kamill

Bonjour,

Qu'est ce que tu obtiens sur le moniteur série?

hbachetti

Code: [Select]
unsigned long nb_tours_roue=0;        // variable nombre de tours de roue
char nb_tours_char[16];                // nombre de tours de roue en chaine

sprintf(nb_tours_char,"%lu",nb_tours_roue);
Serial.print(nb_tours_char);        // envoi au port USB nombre de tours de roue


Je ne vois pas l'intérêt de faire la conversion à la place de print() ou println().
Serial.print(nb_tours_roue); donnera le même résultat.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

fdufnews

Je ne vois pas l'intérêt de faire la conversion à la place de print() ou println().
Serial.print(nb_tours_roue); donnera le même résultat.
D'où ma réponse au #3.
Je me demande si l'application que le demandeur développe n'attend pas un certain formalisme dans la transmission des chaines.
Il faudrait qu'il nous donne des informations supplémentaires s'il veut de l'aide.

lesept

Chez moi ça fonctionne :

Code: [Select]
void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("ok");
  unsigned long nb_tours_roue = 1234567890;      // variable nombre de tours de roue
  char nb_tours_char[16];                // nombre de tours de roue en chaine

  sprintf(nb_tours_char, "%lu", nb_tours_roue);
  Serial.print("***");        // envoi au port USB nombre de tours de roue
  Serial.print(nb_tours_char);        // envoi au port USB nombre de tours de roue
  Serial.println("***");        // envoi au port USB nombre de tours de roue
}

void loop() {}

J'obtiens:
Quote
ok
***1234567890***
Pour le reste, je n'en sais pas plus.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

fdufnews

#13
Dec 06, 2019, 10:32 am Last Edit: Dec 06, 2019, 10:32 am by fdufnews
Bien sur que ça marche mais on obtient la même chose sans passer par sprintf en faisant directement un print de la variable
Code: [Select]
void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("ok");
  unsigned long nb_tours_roue = 1234567890;      // variable nombre de tours de roue
  char nb_tours_char[16];                // nombre de tours de roue en chaine

  sprintf(nb_tours_char, "%lu", nb_tours_roue);
  Serial.print("***");        // envoi au port USB nombre de tours de roue
  Serial.print(nb_tours_char);        // envoi au port USB nombre de tours de roue
  Serial.println("***");        // envoi au port USB nombre de tours de roue
  Serial.print("---");        // envoi au port USB nombre de tours de roue
  Serial.print(nb_tours_roue);        // envoi au port USB nombre de tours de roue
  Serial.println("---");        // envoi au port USB nombre de tours de roue
}

void loop() {}

Quote
ok
***1234567890***
---1234567890---

Yves13011

#14
Dec 06, 2019, 02:55 pm Last Edit: Dec 06, 2019, 04:40 pm by Yves13011
Salut,
Je vois que je ne manque pas d'aide et je vous en remercie. Sous le moniteur série d'Ardouino c'est parfait. Le problème se situerai donc du coté de Windev.
Pour une valeur de 33 je reçois dans une variable chaine "51 38 169 10" plusieurs fois vu que l'envoi est dans la boucle.
le code Ardouino :

Code: [Select]

//Version USB

#include <Wire.h>
#include <LiquidCrystal_I2C.h>        // Ecran LCD
LiquidCrystal_I2C lcd (0x20,16,2);    // adresse 0x20, 16 caractères, 2 lignes
//#include <SoftwareSerial.h>           //
//SoftwareSerial USB_Serial(10, 11);    // RX | TX

const byte pin_capteur=19;            // broche du capteur magnetique RX1 19
int val_capteur;                      // valeur du capteur magnetique
unsigned long nb_tours_roue=0;        // variable nombre de tours de roue
char nb_tours_char[16];                // nombre de tours de roue en chaine
float perimetre_roue=1.80000;         // perimetre roue en metre 99,9999
unsigned long distance=0;             // distance parcourue en mètre 99.999
const byte RAZ = 10;                  // broche bouton remise zero compteur pin 10 et GND
volatile byte top = 0;
int compteur_anti_rebond = 10;        // à modifier suivant le capteur

void setup() {
  // initialisation LED port 13
 pinMode(13, OUTPUT);
 // Ouvre la voie serie USB à 9600 bits par seconde
 Serial.begin(9600);
 
 // initialisation ecran LCD
 // lcd.begin(16 , 2);
 lcd.init();                    
 lcd.backlight();
 lcd.setCursor(0,0);
 lcd.print("RAZ compteur");
 delay(5000);
 lcd.clear();

 pinMode(RAZ,INPUT_PULLUP);
 
 // initialisation broche capteur
 pinMode(pin_capteur,INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(pin_capteur), TOP, RISING);
}

void loop() {
 if (digitalRead(RAZ) == LOW){ nb_tours_roue = 0;distance=0;}
 affichage();
 digitalWrite(13, LOW);     // LED on
}


// Fonction d'interruption pour le comptage du nombre de tours de roue
void TOP() {
  top++ ;
 digitalWrite(13, HIGH);    // LED on
}

void affichage(){
  if(top >= compteur_anti_rebond ){
   nb_tours_roue++;
   top = 0;
 }
 
//Serial.write(nb_tours_roue);      // envoi au port USB nombre de tours de roue
//Serial.println(nb_tours_roue);    // envoi au port USB nombre de tours de roue
sprintf(nb_tours_char,"%lu",nb_tours_roue);
Serial.print(nb_tours_char);        // envoi au port USB nombre de tours de roue
Serial.println("*");                  // affiche un retour de chariot  

 lcd.setCursor(0, 0);
 lcd.print("Nbr : ");
 lcd.print(nb_tours_roue);           // affichage nombre tours de roue sur LCD
 lcd.setCursor(0, 1);
 distance = nb_tours_roue * perimetre_roue;
 lcd.print("Dist : ");
 lcd.print(distance);                // affichage distance sur LCD

}  

Go Up