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 :

concaténation d'un tableau de char en float


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut concaténation d'un tableau de char en float
    Bonjour à tous,
    Je code en C pour un microcontroller PIC18f252.
    Dans mon application, je reçois 4 octets (example 49,13,84,F0) (via L'usart). Il ne sagit pas d'ASCII, mais bien d'un float découpé en 4 octets.

    Mon problème viens dans la concaténation de ces 4 octets. En effet, j'ai trouvé la fonction atof() qui concatène un tableau d'ascii représentant un nombre. Malheureusement, ce n'est pas mon cas.

    Pouvez vous donc m'indiquer une fonction ou méthode pour effectuer cette concaténation?

    note : j'ai tenté les décallages sans résultat :
    GPS_Time=0x00000000;
    GPS_Time |= (char)GPS_Time_Of_Week[3];
    GPS_Time <<= 8;
    GPS_Time |= (char)GPS_Time_Of_Week[2];
    GPS_Time <<= 8;
    GPS_Time |= (char)GPS_Time_Of_Week[1];
    GPS_Time <<= 8;
    GPS_Time |= (char)GPS_Time_Of_Week[0];

    l'erreure étant
    TRIMBLE_decoder.c:223: error 45: operand invalid for bitwise operation
    TRIMBLE_decoder.c:223: warning 113: left & right types are float,char

    Un grand merci d'avance

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    J'ai l'impression que tu reçois un float sur ton port série sous sa forme binaire (sa représentation interne sur la machine).

    Il est possible de reconstituer le float à l'autre extrémité mais il faut pour cela que les 2 parties aient la même représentation binaire d'un float (même nombre de bits, même taille pour la mantisse et l'exposant, ...). En plus, le code va pas être beau à voir mais on en 'est pas encore là.

    Donc déjà, est ce que tu peux faire quelques tests pour s'assurer que les 2 extrémités on bien la même représentation.

    Sinon, il faut transférer le nombre sous une forme portable, une chaine de caractère. Plutôt que de transférer 49,13,84,F0 en binaire, il faut transférer "3.1415926" (par exemple). Donc l'émetteur transforme le floattant en texte et le récepteur retransforme le texte en flottant et comme cela, cela marchera toujours quelque soient les représentations binaires des 2 protagonistes.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    J'ai l'impression que tu reçois un float sur ton port série sous sa forme binaire (sa représentation interne sur la machine).
    en effet.
    Il est possible de reconstituer le float à l'autre extrémité mais il faut pour cela que les 2 parties aient la même représentation binaire d'un float (même nombre de bits, même taille pour la mantisse et l'exposant, ...). En plus, le code va pas être beau à voir mais on en 'est pas encore là.
    l'emetteur envoie le float avec 8 bits d'exposant, 23 de mantisse et 1 de signe. Il me semble que mon pic le voie pareil (norme IEEE-745 il me semble)
    Donc déjà, est ce que tu peux faire quelques tests pour s'assurer que les 2 extrémités on bien la même représentation.
    je crois avoir deja fait des tests sur mon pic pour vérifier (avec des valeures en fixe), mais je vais refaire un test pour être certain.
    Sinon, il faut transférer le nombre sous une forme portable, une chaine de caractère. Plutôt que de transférer 49,13,84,F0 en binaire, il faut transférer "3.1415926" (par exemple). Donc l'émetteur transforme le floattant en texte et le récepteur retransforme le texte en flottant et comme cela, cela marchera toujours quelque soient les représentations binaires des 2 protagonistes.
    Totallement impossible car mon emmetteur est un composant électronique sur lequel je n'ai pas la main.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par tymop Voir le message
    Totallement impossible car mon emmetteur est un composant électronique sur lequel je n'ai pas la main.
    Objection recevable

    Alors, il reste la solution moins propre à condition que l'émetteur et le récepteur aient bien la même représentation d'un float (à toi de le vérifier).

    Un truc dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    float nombre;
    unsigned char *ptr = (unsigned char *)&nombre;
    ptr[0] = 0x49;
    ptr[1] = 0x13;
    ptr[2] = 0x84;
    ptr[3] = 0xf0;
    Et bien sûr, il faut tester que ce que tu reçois est bien identique à ce qui est envoyé (je pense entres autre à l'ordre des octets).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Objection recevable

    Alors, il reste la solution moins propre à condition que l'émetteur et le récepteur aient bien la même représentation d'un float (à toi de le vérifier).

    Un truc dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    float nombre;
    unsigned char *ptr = (unsigned char *)&nombre;
    ptr[0] = 0x49;
    ptr[1] = 0x13;
    ptr[2] = 0x84;
    ptr[3] = 0xf0;
    Et bien sûr, il faut tester que ce que tu reçois est bien identique à ce qui est envoyé (je pense entres autre à l'ordre des octets).
    Impécable. Un grand merci.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par tymop Voir le message
    Bonjour à tous,
    Je code en C pour un microcontroller PIC18f252.
    Dans mon application, je reçois 4 octets (example 49,13,84,F0) (via L'usart). Il ne sagit pas d'ASCII, mais bien d'un float découpé en 4 octets.
    Le premier octet reçu est le MSB (convention courante) ou le LSB ?

    Si c'est le MSB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            GPS_Time = 0;	
    	GPS_Time |= (GPS_Time_Of_Week[0] << (8 * 3)); /* MSB */
    	GPS_Time |= (GPS_Time_Of_Week[1] << (8 * 2));
    	GPS_Time |= (GPS_Time_Of_Week[2] << (8 * 1));
    	GPS_Time |= (GPS_Time_Of_Week[3] << (8 * 0));
    si c'est le LSB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            GPS_Time = 0;	
    	GPS_Time |= (GPS_Time_Of_Week[0] << (8 * 0)); /* LSB */
    	GPS_Time |= (GPS_Time_Of_Week[1] << (8 * 1));
    	GPS_Time |= (GPS_Time_Of_Week[2] << (8 * 2));
    	GPS_Time |= (GPS_Time_Of_Week[3] << (8 * 3));
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. convertir un tableau de char en float
    Par flamme34 dans le forum C++
    Réponses: 11
    Dernier message: 09/08/2012, 14h17
  2. transformer un tableau de char en string puis en float?
    Par maf.mouton dans le forum Débuter
    Réponses: 8
    Dernier message: 30/04/2009, 13h34
  3. Intégrer une vaiable float dans un tableau de char
    Par NoritakaRomain dans le forum C
    Réponses: 2
    Dernier message: 14/05/2007, 15h19
  4. concaténation de char et float
    Par gup dans le forum C
    Réponses: 11
    Dernier message: 31/12/2005, 00h15
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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