J’ai deux petites questions concernant la communication entre une balance ayant une sortie RS232 et mon arduino.
Lorsque je reçoit la chaîne « CHAR » de ma balance, j’obtiens quelque chose du type « W=+ 1.25g » ou « W=+ 14.64g ». Existe-t-il une fonction permettant de garder uniquement la partie nombre (avec la virgule inclue) ? De sorte de couper le reste de l'info en gardant juste mon nombre et pouvoir le comparer avec un autre ?
Ma deuxième questions plus embêtante : ma balance envoie les informations de poids à mon arduino uniquement lorsque j’appuie sur un bouton « Hold » situé sur la balance. Je souhaiterai recevoir l’info à chaque boucle. Le problème est que j’ai contacté le fabricant pour connaitre la commande à envoyer, mais pas de retour. Auriez-vous une idée de quelque chose de générique ou alors est-ce bien spécifique ?
Si la chaîne de caractères est fixe, tu remplaces la position contenant 'g' par 0 (le caractère null), et tu passes le buffer + 2 à la fonction atof().
Cela ne fonctionne pas...
En gros mon code est le suivant, j'ai enlevé la suite.
Je voudrais stocker mon poids par exemple 12.25 dans un int pour le comparer ensuite.
J'ai vu des choses avec scanf ou substring mais je n'arrive pas à m'en sortir ...
Merci beaucoup pour ce retour mais étant débutant je n'arrive pas à intégrer cela dans mon code...
J'était parti sur autre chose : char inData[10]; // Allocate some space for the string
char inChar; // Where to store the character read
byte index = 0; // Index into array; where to store the character
void setup()
{
Serial.begin(9600);
}
void loop()
{
while(Serial.available() > 0) // Don't read unless
// there you know there is data
{
if(index < 9) // One less than the size of the array
{
inChar = Serial.read(); // Read a character
inData[index] = inChar; // Store it
index++; // Increment where to write next
inData[index] = '\0'; // Null terminate the string
Serial.println(inData);
}
}
J'ai réussi à faire ce que je voulais, bon c'est de la bidouille mais ça marche à peu près :
char inData[10]; // Allocate some space for the string
char inChar; // Where to store the character read
byte index = 0;// Index into array; where to store the character
int result1;
int result2;
int result3;
int result4;
int total;
void setup()
{
Serial.begin(9600);
}
void loop()
{
while(Serial.available() > 0) // Don't read unless
// there you know there is data
{
if(index < 9) // One less than the size of the array
{
inChar = Serial.read(); // Read a character
inData[index] = inChar; // Store it
index++; // Increment where to write next
inData[index] = '\0'; // Null terminate the string
Du coup, lorsque j'ai un poids compris entre 01,10kg et 01,19k, c'est gagné.
C'est une solution à l'arrache mais je n'ai pas réussi à former un nombre avec mes 4 chiffres, savez-vous comment faire ?
Et deuxième question plus embétante, je n'ai pas réussi à trouver une manip pour que le code redémarre à chaque réception de données de poids sur le port série. Et c'est le plus embêtant ça ...
Tu n'es pas trés loin de la solution dans ta boucle de lecture du message. Il te suffit grosso modo de ne pas prendre en compte les premiers caractères, ni le dernier.
/* W=+ 14.64g => 10 caractères */
char inData[10]; // Allocate some space for the string
char inChar; // Where to store the character read
byte index = 0; // Index into array; where to store the character
void setup()
{
Serial.begin(9600);
}
void loop()
{
while(Serial.available() > 0) // Don't read unless
// there you know there is data
{
/* W= + 1 4 . 6 4 g
0 1 2 3 4 5 6 7 8 9
*/
inChar = Serial.read();
delay(10);
if (index < 4 | index == 9) { // on ne fait rien ou presque
if (index == 9) { index = 0; break; }
index++;
}
else { // on stocke les valeurs
inData[index] = inChar;
index++;
Serial.println(inData);
}
}
}
Qui me donne :
W
W=
W=+
Pas testé mais on ne doit plus être trés loin.
[EDIT] : Le tableau est trop grand du coup -> char inData[5]