IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

C++ sur Arduino : mettre en forme une chaîne


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut C++ sur Arduino : mettre en forme une chaîne
    Bonsoir,

    Voila : je débute en C++. Je me sers d'un Arduino.

    Un périphérique m'envoie des données sous forme de chaine « nom;valeur;index;diviseur,unité;nom1;valeur;index;diviseur;unité » ... J'arrive bien à faire un log sur une carte µSD, au format brut. Toutes les données se suivent et cela recommence indéfiniment.

    J'ai trouvé ceci dans la FAQ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <sstream>
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        istringstream iss( "mot1;mot2;mot3;mot4" );
        string mot;
        while ( std::getline( iss, mot, ';' ) )
        {
            cout << mot << '\n';
        }
    }
    … mais mon problème, c'est que toutes les données sont séparées par le même séparateur sauf quand cela recommence du début.

    Auriez vous une piste à suivre ?
    Merci.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Pourrais tu juste un peu préciser certaines choses

    1 - Chaque ligne représente-t-elle bien les éléments propres à une et une seule valeur, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    nom1;valeur;index;diviseur,unité;
    nom2;valeur;index;diviseur;unité;
    nom3;valeur;index;diviseur;unité;
    nom4;valeur;index;diviseur;unité;


    2 - Je présumes, vu que tu viens demander de l'aide, que tu ne veux pas juste te contenter d'afficher ce que tu obtiens... Pourrais tu préciser ce que tu veux faire des informations que tu lis
    3 - Hormis pour nom1 dont je présumes (peut etre à tord) que c'est effectivement une chaine de caractères, pourrais tu préciser à quoi ressemblent valeur, index, diviseur et unité est-ce des chaines de caractères des entiers des réels autre chose (à la limite, fais nous un copier / coller de deux trois lignes réelles du fichier )

    Ce n'est qu'une fois que tu nous auras donné ces précisions que tu auras une chance d'obtenir des réponses efficaces, car je crains que les boules de crystal de tous ceux qui sont susceptibles de t'aider ne soient en panne
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    ouvrier
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut
    je vous explique mon but.

    ma chaudière est équipée d'un port com. sur se port elle envoie en permanence des données.

    ces données on cette forme:

    Attente arret 1;0011;1;1;zst;Kesseltemp.;0110;2;2;°C;Abgastemp;7;1;%;Sekundärluft;0000;8;1;%;Saugzug Soll;0065;9;1;%;Saugzug Ist;1947;10;1;U;Einschub Ist;0000;12;1;%;O2 Regler Pell ;0035;13;1;%;Füllstand: ;17844;14;207;%;Ansauggeschw.;0454;15;100;m/s;Strom Austrags;1010;16;1000;A;Fühler 1;0123;17;2;°C;Kesselsoll ;0080;18;2;°C;Pufferoben ;0000;20;2;°C;Pufferunten ;0000;21;2;°C;Pufferpumpe ;8192;22;1;%;Boiler 1;0121;23;2;°C;Vorlauf 1;0072;24;2;°C;Vorlauf 2;0031;25;2;°C;HK Pumpe 1;0001;26;1; ;HK Pumpe 2;0000;27;1; ;Aussentemp;0026;28;2;°C;Kollektortemp;0000;29;2;°C;Betriebsstunden;1195;30;1;h;Fehler;Kein Fehler ;99;1; ;
    avec l'arduino j'arrive à faire un log sans problème. mais maintenant j'aimerais les mettre en forme pour pouvoir les exploiter sous excel ou autre.

    comme on peut le voir chaque donnée comporte 5 "champ"
    son nom , la valeur , l'index , le diviseur , l'unité.

    ex: Kesseltemp.;0077;2;2;°C = Tchaudière. 0077/2 ,2, C
    pour avoir la T on divise la valeur par le diviseur .

    l'index je suppose que c'est ... l'index

    au départ je voulais faire cela avec un ptit soft , j'ai un exemple sous VB6
    mais cela m’ennuie de laissé un pc allumer juste pour ça, alors que l'arduino peut le faire .

    merci

  4. #4
    Membre émérite
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par défaut
    Bonsoir,

    Tu ne peux te contenter de créer ton log avec Arduino et mettre en forme à l'import sur ton PC?

    Si ce qui suit peut te donner de l'inspiration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <sstream>
    #include <string>
    #include <vector>
    #include <iostream>
     
    using namespace std;
     
    //represente un enregistrement
    struct Enregistrement {
    	std::string nom;
    	std::string valeur;
    	std::string index;
    	std::string diviseur;
    	std::string unite;
    };
     
    //lit un enregistrement a partir d'un flux, renvoie vrai si les 5 champs sont lus
    bool parse( std::istream & s, Enregistrement & e )
    {
    	//nom
    	return std::getline( s, e.nom, ';' ) 
    	  && std::getline( s, e.valeur, ';' )
    	  && std::getline( s, e.index, ';' )
    	  && std::getline( s, e.diviseur, ';' )
    	  && std::getline( s, e.unite, ';' ) ;
    }
     
    //affiche avec un formatage "maison"
    void print( Enregistrement const& e ){
    	std::cout << "----------------------" << std::endl;
    	std::cout << "nom       : " << e.nom << std::endl;
    	std::cout << "valeur    : " << e.valeur << std::endl;
    	std::cout << "index     : " << e.index << std::endl;
    	std::cout << "diviseur  : " << e.diviseur << std::endl;
    	std::cout << "unite     : " << e.unite << std::endl;
    	std::cout << "----------------------" << std::endl;
    }
     
    int main()
    {
    	// 0;1;2;3;4;0;1;2;3;4
        istringstream iss( "nom;valeur;index;diviseur;unite;nom1;valeur;index;diviseur;unite" );
     
    	std::vector< Enregistrement > enregistrements ;
     
    	Enregistrement e ;
        while ( parse( iss, e ) )
        {
    		enregistrements.push_back(e);
        }
     
    	std::cout << enregistrements.size() << " enregistrement(s) lu(s)" << std::endl;
    	for ( std::vector< Enregistrement >::const_iterator it = enregistrements.begin(); it != enregistrements.end(); ++it ){
    		print( *it );
    	}
     
    	return 0;
    }
    PS :
    - ça n'est pas parfait, tu peux améliorer la gestion des erreurs de formatage
    - il y avait une virgule à la place d'un point virgule dans ton code original

Discussions similaires

  1. mettre en forme une cellule excel a partir d'access
    Par moimemessssssssss dans le forum VBA Access
    Réponses: 3
    Dernier message: 21/08/2010, 23h23
  2. [Dates] Mettre en forme une date
    Par joboy84 dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2009, 14h29
  3. Mettre en forme une textbox par masque ou "feinte"
    Par nicolas2603 dans le forum VBA Access
    Réponses: 4
    Dernier message: 20/02/2008, 16h26
  4. Réponses: 24
    Dernier message: 28/08/2006, 11h55
  5. [VB]Comment mettre en forme une grille de données
    Par CBleu dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/02/2006, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo