Communication RS232 et concaténation chaine de caractère

Bonjour,

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 ?

Merci d’avance.

Bonjour,

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

Donc

buf[8] = 0;
float poids = atof(buf + 2);

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

char analogValue = 0;

void setup() {

Serial.begin(9600);
}

void loop() {

if (Serial.available() > 0) {

analogValue = Serial.read();

Serial.print(analogValue);
}
}

Merci d'avance.

String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {
0, -1 };
int maxIndex = data.length()-1;
for(int i=0; i<=maxIndex && found<=index; i++){
if(data.charAt(i)==separator || i==maxIndex){
found++;
strIndex[0] = strIndex[1]+1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

et tu l'utilise de la façon suivante:

String poids = getValue(weight, '+', 0);

normalement ça fonctionnera

Bonjour,

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);
}
}

}

Qui me donne :
W
W=
W=+
....

Mais ce n'est toujours pas ça.

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

}
if(index == 9)
{
Serial.print(inData[4]);
Serial.print(inData[5]);
Serial.print(inData[6]);
Serial.print(inData[7]);
Serial.println(inData[8]);
result1 = inData[4]-'0';
if(result1 == -16){
result1 = 0;
}
Serial.println(result1);
result2 = inData[5]-'0';
Serial.println(result2);
result3 = inData[7]-'0';
Serial.println(result3);
result4 = inData[8]-'0';
Serial.println(result4);
total = result1,result2;
Serial.println(total);
index++;
if(result1==0 && result2==1 && result3==1)
{
Serial.println("c'est gagné");
}
}
}

}

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

Merci d'avance.

Bonjour,

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]

@+

Zoroastre.