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++Builder Discussion :

Travail avec les int8


Sujet :

C++Builder

  1. #1
    Candidat au Club
    Inscrit en
    mai 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Travail avec les int8
    Bonjour,
    Je travaille sur une application communicant par RS232, et donc sur des variable de type __int8.
    Mon problème est que, lors du débogage, ces avariables apparaissent sous forme de caractère ce qui n'est vraiement guère pratique.
    J'utilise donc souvent l'inspecteur pour voir la valeur numérique de la variable, et là, j'obtient soit quelque chose du genre 0x56, ce qui est correct, soit 0xFFFFFF56, ce qui l'est moins ...

    De plus lors d'une comparaison if (toto== 0x56), le if me retourne false lorsque toto=0xFFFFFF56

    J'ai essayé les toto= titi & 0xFF ou toto=static_cast<__int8>titi mais rien n'y fait.
    est-ce que quelqu'un aurait une explication et surtout ... une solution

  2. #2
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 916
    Points : 991
    Points
    991
    Par défaut
    Bonjour,
    J'ai aussi travaillé sur une liaison type RS232. Tu recoit des octets, donc des "char" à partir de ça, tu peux convertir ton octet comme tu le désires pour ton traitement.
    Je ne sais si tu utilises le composant ComPortRx ou si tu fais une API windows, mais dans les deux cas, tu as ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    AnsiString reception;
    ComPort1->ReadStr&#40;reception,*Count&#41;; //lecture du portCom
    for&#40;i=1;i<=*Count;i++&#41;        //buffer pour le traitement
    &#123;
       //       Memo1->Lines->Add&#40;IntToStr&#40;&#40;unsigned char&#41;reception&#91;i&#93;&#41;&#41;;     //affichage de l octet
              recu&#91;Count_recu&#93;=&#40;unsigned char&#41;reception&#91;i&#93;;                 //sauvegarde dans le buffer
              if&#40;++Count_recu>DIM_RECU&#41; Count_recu=0;
    &#125;
    pour le composant ou ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DWORD Count;
    char Str&#91;1024&#93;;
     
    if&#40;ReadFile&#40;comHandle, Str, 1024, &Count, 0&#41;==true&#41;
    &#123;
    //traitement
    &#125;
    else
    &#123;
    //erreur de lecture
    &#125;
    Si ça peux t'aider

  3. #3
    Candidat au Club
    Inscrit en
    mai 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse,
    En fait j'utilise le composant TComPort dans le cadre d'un protocole personnel implémenté pour une liaison domotique de type ModBus.
    J'ai donc crée une classe Messagerie implémenant un TComPort et je suis obligé de gèrer le protocole de manière très "serrée": j'emet un octet, je controle que c'est bien cet octet qui a été émis (CMS/DA), le gère les ACKNOLEDGE, etc ... dans le cadre d'un séquenceur.
    J'ai donc besoin démettre et recevoir des octet, pas des chaines (je gère aussi le timing entre deux octets) et de comparer chaque octet reçu à certaine valeurs attendue par le protocole.
    D'où mon soucis.
    L'utilisation de "unsigned char" pourrait peut être résoudre mon problème sauf que
    - comment comparer un unsigned char a une valeur de type 0xFF sans faire des acrobaties de conversion IntToStr peu élégantes
    - comment faire en sorte que le debugger (en passant la souris sur la variable) m'affiche bien une valeur int (nota: ce dernier point n'est qu'une clause de confort, moins important que le premier point)

  4. #4
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 916
    Points : 991
    Points
    991
    Par défaut
    Pour ta comparaison, tu peux faire de la manière suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if&#40; &#40;int&#41;toto == 0xFF&#41;
    &#123;
        //traitement
    &#125;
    Tu cast ton octet pour lui faire comprendre que c'est un entier. Pour le compilateur, une valeur entière est convertie en hexa (en interne) pour que le microprocesseur accepte le code hexa généré par ton compilateur, cela ne pose donc pas de problème pour la comparaison entier/hexadeciale.

    Pour ton autre question, tu peux voir ta variable évoluer en la sélectionnant et en faisont Ctrl+F5, on en allant dans Run->Add Watch dans Builder. A partir de là, une fenêtre s'ouvre te permettant d'ajouter un point de suivit t'indiquant à chaque pas la valeur de la variable suivie. Tu peux configurer ce point de suivie pour t'afficher cette variable en entier, hexadécimale, caractère... suivant ton choix. Par défaut la valeur de la variable est affichée en fonction de sa déclaration.
    Voilà, j'espère que j'ai répondu à ta question, sinon je reste dispo
    Bon courage

  5. #5
    Candidat au Club
    Inscrit en
    mai 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    J'ai essayé de travailler avec des unsigned char au lieu des __int8 en definissant un type perso par typedef.
    C'est alors que je me suis apperçu (le compilateur plutot) que ce type existait déja: c'est le type "byte".
    J'ai donc transformé toutes mes déclaration __int8 en byte et cela fonctionne parfaitement.

    J'ai aussi utilisé la fenêtre watch que j'utilisait peu, et c'est vrai que c'est rudement pratique.

    Merci pour tes judicieuses réponses

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/09/2006, 02h23
  2. Réponses: 2
    Dernier message: 22/06/2006, 12h03
  3. travailler avec les images et les vecteurs
    Par susimido dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 24/04/2006, 16h02
  4. Réponses: 8
    Dernier message: 22/11/2005, 08h29

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