Numérique vers chaine

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.

Avec Serial.print() tu envoies des chaines de caractères. La transformation est réalisée par print directement.

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.

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().

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

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.

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.

Ç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

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.

Bonjour,

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

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.

hbachetti:
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.

Chez moi ça fonctionne :

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:

ok
1234567890

Pour le reste, je n'en sais pas plus.

Bien sur que ça marche mais on obtient la même chose sans passer par sprintf en faisant directement un print de la variable

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() {}

ok
1234567890
---1234567890---

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 :

//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

}

Tu utilises un Mega ? C'est le seul pour lequel on puisse utiliser une interruption sur la pin 19.

Sinon, tes codes sont bizarres. ça commence bien avec 51 qui correspond au "3" en ASCII. Mais ensuite ça part en vrille

  • 51 --> 3
  • 38 --> &
  • 169 --> (c)
  • 10 --> line feed

Il n'y aurait pas une embrouille avec un bit de parité qui serait attendu par l'application par hasard?
Comment est initialisé le port série dans l'application?

Pffff.... mets ton code entre balises </> STP

Pour le code entre balises c'est fait.
Effectivement j'ai un problème de comprehension de la chaine réceptionnée.
L'initialisation du port dans l'application Windev : com3, taux 9600, parité paire, 8bit donnée, 1 bit de stop

L'arduino ne transmet pas de bit de parité