Pages: [1]   Go Down
Author Topic: Conversion d'une chaine de caractères Ascii en Integer  (Read 584 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :

Code:
#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 :

Code:
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ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 :

Code:
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. :/
Logged

france
Offline Offline
God Member
*****
Karma: 8
Posts: 701
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Christian

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France
Offline Offline
Faraday Member
**
Karma: 52
Posts: 5341
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Il y a un truc qui va pas dans ton code :
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 ÿÿÿÿÿ smiley-wink

Commence par vérifier la bonne réception de tes données avec ce code :
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());
  }
}
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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.
Logged

Pages: [1]   Go Up
Jump to: