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 :

Probleme lors d'une conversion 24bits > 32bits


Sujet :

C

  1. #1
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 097
    Par défaut Probleme lors d'une conversion 24bits > 32bits
    Bonjour,

    Je vous expose mon probleme:
    Je recois via liaison Série une trame de données 24bits venant d'un convertisseur.
    Voulant exploiter ces données je voudrais les convertir en étendant le bit de signe.
    Le probleme est que après avoir faire le programme, un collègue m'a dit que mes nombre sont pas corrects......(cohérents mais pas corrects).

    Je vous montre mon bout de code. Je ne sais pas votre avis dessus (c'est d'ailleurs l'occasion de me le donner).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    char message[200]; // buffer de reception
    int ech;
    char *pech;
     
    pech = (char*)&ech;
     
    /* Reception des echantillons */
     
    *(pech+1)     = message[0];
    *(pech+2)     = message[1];
    *(pech+3)     = message[2];
     
    if(*(pech+1) &0x80) *pech = 0xFF; // Extension bit de signe
    else *pech = 0x00;
    Je ne sais pas si c'est la bonne méthode.

    Si quelqu'un a des suggestions.... Elles seront les bienvenues.

    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 962
    Par défaut
    il faudrait d'abord que vous vérifiez si les nombres négatifs que vous recevez du convertisseur sont vraiment exprimés en complément à 2 ou à 1 ou si le bit de signe est indépendant du reste du nombre :

    en 24 bits en complément à 2 -1 == 0xFFFFFF
    mais en complément à 1, -1 = 0xFFFFFE
    et avec bit indépendant -1 = 0x800001

    en fonction de cette information vous pourrez écrire correctement le code…
    et obtenir un nombre négatif exprimé correctement en complément à 2 du côté PC…

    accessoirement, il faut aussi que vous vérifiez que "int" est bien un entier de 32 bits en fonction de vos options de compilation ou des valeurs par défaut sur votre environnement…
    ce serait trop bête de perdre du temps pour une erreur à ce niveau…

    (et pensez à utiliser "union" en C c'est fait pour çà…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    union {
     int ivalue ; // if int is really a 32 bits integer…
     unsigned char bytes[4] ;
    }
    )

    et aussi, vérifiez l'ordre dans lequel les bytes arrivent : du moins vers le plus signifiant ou l'inverse…

  3. #3
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 097
    Par défaut
    salut,

    Merci de ta réponse.
    Donc, d'apres ta réponse (et la datasheet) c'est un nombre complément à 2 (0xFFFFFF = -1).
    Sur mon pc, j'avais eu le meme doute que toi, j'avais donc fait un sizeof(int) pour m'en assurer. Et c'est bien un 32bits (ou bien 4 octets).

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 962
    Par défaut
    Citation Envoyé par Flob91 Voir le message
    salut,

    Merci de ta réponse.
    Donc, d'apres ta réponse (et la datasheet) c'est un nombre complément à 2 (0xFFFFFF = -1).
    Sur mon pc, j'avais eu le meme doute que toi, j'avais donc fait un sizeof(int) pour m'en assurer. Et c'est bien un 32bits (ou bien 4 octets).
    et j'oubliais évidemment :

    il faut tester si votre architecture CPU côté PC est little endian ou big endian…
    pour savoir dans quel ordre mettre les bytes dans l'array de l'union…

  5. #5
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 097
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 097
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    et j'oubliais évidemment :

    il faut tester si votre architecture CPU côté PC est little endian ou big endian…
    pour savoir dans quel ordre mettre les bytes dans l'array de l'union…
    Bien vu l'aveugle.
    J'ai mis les octets dans l'autre sens et ca a marché.

    Merci de ton aide...> Résolu

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

Discussions similaires

  1. [XL-2003] Probleme lors d'une conversion d'un fichier .xls vers .cvs
    Par la_pascaline dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 29/06/2010, 17h22
  2. Probleme lors d'une recherche sur les forums
    Par JUSTIN Loïc dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 8
    Dernier message: 27/07/2005, 12h22
  3. Probleme lors d'une suppression
    Par DrTank dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/04/2005, 17h38
  4. Réponses: 2
    Dernier message: 21/06/2004, 15h55
  5. Réponses: 13
    Dernier message: 10/05/2004, 16h49

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