Stockage d'une variable depuis une trame?

Bonsoir,
Ceci est mon premier post sur le forum, je découvre doucement les possibilités de l'arduino.

Voila, j'utilise une balance industrielle qui envoie sur le port série une "trame" du type :
ID 014836968363890
TIME 114532
WEIGHT 22.6

J'ai donc réussi à décoder cette trame et l'afficher dans le terminal.

Maintenant je souhaiterais afficher les infos sur un lcd, mais je ne sais pas comment m'y prendre avec le code, il faudrait que l'affichage soit du type:

Numero de serie : 014836968363890
Heure : 11:45:32
Mesure poids : 22,6 Kg

Je sais afficher les infos "qui ne changent pas" mais pour les variables je suis bloqué.

Si vous avez des suggestions ou des exemples de code, je suis preneur...

Merci

Salut,
Pour afficher des infos qui varient, il te faut utiliser la famille des fonctions printf du C.

#include <stdio.h>
a=5;
printf("La valeur de a est %d",a);

donne :

La valeur de a est 5

Pour plus de détail, il te faut voir le playground, notamment la dernière partie qui traite de l'affichage sur LCD.

churchill

Merci Churchill pour ta réponse, j'ai regardé sur http://www.cplusplus.com/reference/clibrary/cstdio/printf/ et j'y ai trouvé des choses interressantes.

Par contre, lorsqu'on fait un serial.begin dans la boucle, l'arduino lit caractère âpres caractère non?

Soit par exemple dans mon cas : W puis E puis I puis G puis H puis T ? Mais il ne lit pas d'un coup "weight" alors comment fait t-on pour lui dire attend de lire weight, puis ecrit le nombre qui suit...
Ou mieux, et je ne sais pas si cela se fait : Lui dire mets dans ton buffer toute la trame puis extrait ce qui est intéressant.
C'est sur ce point que j'ai de grosses lacunes, par contre pour la gestion du lcd j'ai pas de souci.

irahaglore

Salut,

tu stock la trame décodé dans quelle facon? dans un variable de type char?
Peut etre que dès le décodage de la trame tu pourrais compté chaque caractere et au bout X carateres tu change de variable

une piste si tu es sûre de recevoir toujours les données sous le même format:

ID 014836968363890
TIME 114532
WEIGHT 22.6

Dans ce cas tu peux utiliser la fonction scanf de la lib stdio.h (je l'utilise souvent pour décoder des trames)

  1. tu récupères la trame compléte dans un string en utilisant "ID" comme repère de début de trame, grâce à une boucle
  2. ensuite tu appliques la fonction scanf au string. La fonction récupéra alors les valeurs de ID, TIME et WEIGHT dans les variables que tu auras associés.
    Il y a pas mal d'exemple de scanf sur le web.

Eventuellement je peux te fournir un exemple de code.

Bonsoir,

Merci pour ces réponses, Fyaway : J'utilise une variable du type "unsigned char" pour stocker la trame.

Gromain59, merci pour le scanf, je veux bien un exemple de code, et je vais dégrossir le sujet. Du coup est ce judicieux d'utiliser "unsigned char" pour stocker la trame. J'ai vu qu'il existait aussi fscanf qui "Read formatted data from stream" selon http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
quelqu'un l'utilise?

irahaglore.

comme promis un exemple de code gérant la réception de données via la liaison série et le décodage.

/*

Receptionne et traite une commande sur le port serie
La trame doit être du type " #%x/%x/%x/%x*", avec x un entier
Lors de la reception du caractere de debut de commande "#", les caracteres suivants sont stockés dans un buffer (asciiString) jusqu'a la reception du caractere de fin de commande "*".
Ensuite, le buffer est decode par la methode "scanf"

 */


#include <String.h>
#include <stdio.h>

char asciiString[80];

boolean flag=false;
int j=0;

//variables de stockage resultat scanf
int int1=0;
int int2=0;
int int3=0;
int int4=0;

//valeur de timeout pour la reception de la trame
int tps_max_lecture = 200;      //lecture d'un code, compteur max entre tous les caracteres d'un code
int tps_max_carte = 1000;      //compteur max entre reception d'un caractere


void setup() 
{ 
      Serial.begin(38400); 
} 

void loop()
{

lecture_serial();

}


int lecture_serial(){            // lecture d'une trame entrante

      int timeout=0;
      
if(Serial.available()>0){

      while(Serial.available()>0){
            
         char lu= Serial.read();
             //Serial.print(lu);
         //remise a zero de l'index et effacement du buffer si detection caractere de debut de trame #
        if(lu=='#'){
                  j=0;
                        memset (asciiString,' ',80); // initialisation chaine vide

                  //asciiString = "\0";  
                  flag=true;
        }
         else if(lu=='*'){

                  Serial.print("Commande recue: ");       
                  Serial.println(asciiString);
                  
                  sscanf(asciiString, "%d/%d/%d/%d", &int1, &int2, &int3, &int4);
                  
                  Serial.print("entier 1 = ");
                  Serial.println(int1);
                  Serial.print("entier 2 = ");
                  Serial.println(int2);
                  Serial.print("entier 3 = ");
                  Serial.println(int3);
                  Serial.print("entier 4 = ");
                  Serial.println(int4);
                  
                     flag=false;
            }
         else if (flag==true){
                  asciiString[j] = lu;
                  j++;
         }            

      timeout++;
      
      if(timeout> tps_max_lecture)
            {
            return -1;
            }      
      }

}
      return j;
      
}

j'utilise pour recevoir des trames qui commencent pas "#" et se termine par "*", avec les valeurs séparés par des "/"
Dans ton cas, il te faut trouver un autre moyen d'isoler la trame, par ex:
"I" puis "D" = debut de trame
pour la fin de trame par contre peut être un délai ?
et bien sur modifier sscanf avec le bon masque (ID, TIME, WEIGHT)

bon amusement...

Gromain

Super! Merci Gromain, je vais adapter a mon besoin et tester tout cela

A bientot!

irahaglore