Conversion d'une chaine de caractères Ascii en Integer

Bonjour tout le monde, je rencontre un leger problème, j'ai une balance éléctronique qui m'envoie la masse (1g à 6000g à 1g près) via une sortie RS232 sous forme de tableau ASCII.
J'ai déjà réussi à recuperer ces données et à les afficher via le code suivant :

#include <SoftwareSerial.h>

#define RX (10)
#define TX (11)

SoftwareSerial mySerial(RX, TX);

char Balance[18];
int i=0;

void setup()  
{
  Serial.begin(115200);
  mySerial.begin(9600);
}

void loop()
{
  if (mySerial.available())
  { 
	  for(i=0;i<18;i++)
	  {
		Balance[i] = mySerial.read();
		Serial.write(Balance[i]);
	  }
  delay (500);  
  }
}

Ce qui me donne dans le moniteur série :

ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿN:          134g  
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿN:          134g  
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿN:          134g  
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿN:          138g  
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿN:          139g  
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

Comme vous pouvez le voir, je réussi à récuperer la masse. Dans la doc de la balance, il est indiqué qu'elle envoie les données sous cette forme :

B* B B B B B B B B 0 . 0 B g B B CR LF

( B* = Blanc ou M; B/0/. = Blanc/valeur de poids/point décimal; g = Unité de poids; CR = Retour de chariot; LF = Avance de ligne)

J'ai d'abord essayé de ne traiter les données qu'à partir du 10ème caractère jusqu'au 13ème, sans succès.
J'ai aussi tenté dans ma boucle for d'ajouter dans un autre tableau tous "balance*" qui correspondent à un nombre avec le code suivant :*
* *for(i=0;i<18;i++)   { balance[i] = mySerial.read(); if (balance[i] >= 0x48 && balance[i] >= 0x57) { poidsTab[i]=balance[i]; Serial.write(poidsTab[i]); }   }* *
Mais dans le moniteur série je ne récupère qu'un simple "g" pour chaque pesée.
Après avoir effectué quelques recherches j'ai tenté d'utiliser la fonction atoi() mais comme pour le reste, je n'ai rien obtenu de satisfaisant...
Du coup, je ne sais plus trop quoi faire pour avoir cette masse dans une variable de type integer. :confused:

if (balance >= 0x48 && balance >= 0x57)
Remplacer par <= le second test (entre 0 et 9 inclus)

Oh, je me sens bête maintenant. Après correction, le programme ne m'envoi plus de "g" à chaque pesée mais des "N". :frowning:

Bonjour,

Il y a un truc qui va pas dans ton code :

if (mySerial.available()) // Si UN octet est disponible
  { 
	  for(i=0;i<18;i++) // Pour i de 0 à 17
	  {
		Balance[i] = mySerial.read(); // Lit UN octet
		Serial.write(Balance[i]); // Affiche UN octet
	  }
  delay (500);  
  }

Ton tableau Balance[] ne sert à rien ici et comme tu n'attends pas d'avoir 18 octets avant de lire 18 fois un octet tu te retrouve avec des caractères du style ÿÿÿÿÿ :wink:

Commence par vérifier la bonne réception de tes données avec ce code :

if#include <SoftwareSerial.h>

#define RX (10)
#define TX (11)

SoftwareSerial mySerial(RX, TX);

void setup() {
  Serial.begin(115200);
  mySerial.begin(9600);
}

void loop() {
  if (mySerial.available()) { 
    Serial.write(mySerial.read());
  }
}

Merci pour l'info ! Malheureusement la balance se trouve dans mon lycée et je n'y aurai pas accès avant mardi. Cependant, l'interet du tableau pour moi était d'avoir toutes les données envoyées par la balance présentes dans un tableau afin de pouvoir les traiter plus facilement, mais, finalement, je me dis que ce serai peut-être plus simple de faire sans.
Bref merci beaucoup pour ta réponse, je testerai ça mardi :slight_smile:

if (balance[i] >= 0x48 && balance[i] >= 0x57)

Il y a mal donne
0x48 = H
0x57 = W

Je crois que tu voulais mettre
48 = 0
57 = 9

Maintenant, une bonne habitude pour éviter ce genre de bévue. Utiliser des constantes du même type que la variable que l'on teste. Tu veux tester un caractères pourquoi ne pas utiliser des constantes caractères.

if (balance[i] >= '0' && balance[i] <= '9')

en plus le code est plus lisible car on sait tout de suite ce que l'on teste.

Bonsoir baraa c'est un autre sujet - vous devriez ouvrir un post

Postez le code source et explicitez votre question exacte