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 :

Afficher une trame brut (CommPortDriver1) [Débutant]


Sujet :

C++Builder

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut Afficher une trame brut (CommPortDriver1)
    Bonjour,

    Me revoila avec cette trame issue d'une liaison RS232.

    Mon soucis maintenant, c'est que je dois travailler avec le composant CommPortDriver1, je dois avouer que ça marche pas trop mal pour le moment, meme si je ne comprends pas tout

    Donc j'envois un caractère sur la RS232 par le biais de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CommPortDriver1->SendString("H");
    Maintenant je voudrais simplement afficher ma trame brut de décoffrage dans un memo, pour ceux qui connaissent, elle aura la même tète que lorsque j'utilise HyperTerminal, c'est à dire une suite de caractère incompréhensible.

    Il doit surement utiliser une fonction inverse a SendString, mais je ne la connais pas, donc si quelqu'un peut voler à mon secours

    Merci d'avance

    cdt Coxycross

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    TCommPortDriver n'est-ce pas obsolète depuis 10 ans ?
    Le Zip contient une Démo complète (ComTest.dpr \ MainFrm.pas) en Delphi, tu devrais t'en inspirer !

    Version de C++Builder ?

    Tu ne confond pas avec TComPort ?
    Bien plus récent avec des versions compatibles avec C++Builder 6 à XE 2

    Sinon pense que le COM peut s'utiliser comme un "fichier"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CreateFileA(
      AnsiString().sprintf("\\\\.\\COM%d", PortNum)).c_str(), 
      GENERIC_READ | GENERIC_WRITE, 0, 0, 
      OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut
    Bonjour,

    Là ou je fais mon stage, il travaille sous Borland C++ builder 6, et honnêtement je ne connaissais pas C++ builder avant que j'arrive ici.
    Le fais que le composant date de plus de 10ans ne m'étonne guère, vu l'état des pc ...

    Enfin, je fais avec ce que l'on me donne

    Et merci pour l'info, je vais me mettre à la recherche de ce .zip

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Citation Envoyé par coxycross Voir le message
    Et merci pour l'info, je vais me mettre à la recherche de ce .zip
    Pas besoin de chercher : TCommPortDriver
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut
    AH bah parfait !

    Merci beaucoup, je vais regarder ça avec attention

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut
    Bonjour,

    Je suis presque désolé de revenir ici, mais ce composant du siècle dernier me pose plein de soucis ...

    Cependant, j'ai un début de code ( c'est tout pourri et basique ... )

    Puisque je veux afficher la trame brut dans un memo, j'ai donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Memo1->Lines->Add(xxxxx)
    Donc ma question est, par quoi faut-il remplacer les xxxx dans ce bout de code afin d'afficher la trame avec le composant TCommPortDriver (sachant que la trame n'est que des caractères) ?


    Si quelqu'un a un début de réponse, je suis preneur, parce que je commence a désespérer ....

    Merci d'avance

    cdt Coxycross

  7. #7
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Hello
    si tu utilise bien TComport
    le code posté précédemment pas ShaiLeTroll devrait parfaitement convenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void __fastcall TPortComShaiSwitchMainForm::ComDataPacketEventHandler(System::TObject* Sender, const String Str)
    {
      int BufSize = Str.Length();
      char* Buffer = new char[BufSize * 2 + 1];
      ZeroMemory(Buffer, BufSize * 2 + 1);
      BinToHex(Str.c_str(), Buffer, BufSize);
      AnsiString HexaStr = Buffer;
      delete [] Buffer;  
     
      MemoCOMResponse->Lines->Add(HexaStr); // ici remplace MemoCOMResponse par memo1
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    @DjmSoftware, c'est justement le problème, c'est le TCommPortDriver et non le TComPort

    @coxycross
    A partir d'où ?
    Dans le OnReceiveData ou OnReceivePacket

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm1::ComReceivePacket(System::TObject* Sender, void* DataPtr, int DataSize)
    {
      AnsiString Text;
      Text.SetLength(DataSize);
      CopyMemory(Text.c_str(), DataPtr, DataSize); // En Delphi, manipulé une AnsiString comme un char* est un grand classique, plus délicat en C++Builder mais semble que cela fonctionne quand même, CopyMemory ignore que c_str() fourni un const char*
      Memo1->Lines->Add(Text);
     
      char* Buffer = new char[DataSize* 2 + 1];
      ZeroMemory(Buffer, DataSize* 2 + 1);
      BinToHex(DataPtr, Buffer, DataSize);
      AnsiString HexaStr = Buffer;
      delete [] Buffer;  
     
      Memo1->Lines->Add(HexaStr);
    Si c'est depuis un autre endroit, ReadData fourni sur le même principe un Pointer et la taille lue !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut
    Justement comme dit plus haut, je n'utilise pas TComport, mais TCommPortDriver, et donc le "ComDataPacketEvent etc ..." ne fonctionne pas puisque je ne sers pas du composant DataPacket

    cdt Coxycross

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut
    @ShaiLeTroll Après un rapide test de ton code, j'obtiens les erreurs suivantes, il est très possible que les erreurs viennent de moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BinToHex(DataPtr, Buffer, DataSize);
    Pour cette ligne : Impossible de convertir void en char et Mauvaise correspondance de type dans le paramètre Buffer(char désiré, void obtenu)

    Dans le doute, je copie/colle aussi toute la partie de mon programme qui est dans le "CommPortDriver1ReceiveData"

    C'est un petit peu long, mais peut être que ça te sautera plus aux yeux que moi

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    void __fastcall TForm3::CommPortDriver1ReceiveData(TObject *Sender,
          Pointer DataPtr, int DataSize)
    {
    //transtypage de la variable DataPtr
        unsigned char *p = (unsigned char*)DataPtr;
        unsigned char c1, c2;
     
        int index = 0;
        //lorsqu'il y a un caractère dans la file d'attente
        while(DataSize > 0)
        {
            DataSize--;
            c1 = p[index++];
     
            valeur[tempo] = c1;
            tempo++;
            if(tempo > (tempo2+14))
            {
                if(valeur[tempo2+0] != 129)
                {
                        while(valeur[tempo2+0] != 129) tempo2++;
                }
                else
                {
                    int val;
                    val = valeur[tempo2+2]*256+valeur[tempo2+1];
                    val =  val >> 2;
                    if(val>=4096) val = val- 4096;
                    val1 = val1 + val;
     
     
                    val = valeur[tempo2+4]*256+valeur[tempo2+3];
                    val =  val >> 2;
                    if(val>=4096) val = val - 4096;
                    val2 = val2 + val;
     
     
                    tempo3++;
                    if(tempo3 > 19)
                    {
                            Label1->Caption = FormatFloat("0.000",((val1/20.)-2048)/409.6);
                            Label2->Caption = FormatFloat("0.000",((val2/20.)-2048)/409.6);
                            val1 = 0;
                            val2 = 0;
                            val3 = 0;
                            if(tempo > 199988)
                            {
                                tempo = 0;
                                tempo2 = 0;
                            }
                            tempo3 = 0;
                    }
                    AnsiString Text;
      Text.SetLength(DataSize);
      CopyMemory(Text.c_str(), DataPtr, DataSize); // En Delphi, manipulé une AnsiString comme un char* est un grand classique, plus délicat en C++Builder mais semble que cela fonctionne quand même !
      Memo1->Lines->Add(Text);
     
      int BufSize = Str.Length();
      char* Buffer = new char[BufSize * 2 + 1];
      ZeroMemory(Buffer, BufSize * 2 + 1);
      BinToHex(DataPtr, Buffer, DataSize);
      AnsiString HexaStr = Buffer;
      delete [] Buffer;
     
      Memo1->Lines->Add(HexaStr);
                    tempo2 = tempo2 + 7;
                }
            }
     
     
        }//while
    }

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Tu avais déjà tout ça, tu aurais du nous le fournir dès le début !

    DataSize-- !
    Déjà tu pourris le paramètre !
    Donc le code que j'ai fourni utilise 0 comme taille de buffer, c'est mal barré !

    As-tu lu un minimum le code, la documentation des fonctions ?

    Str, tu n'as pas remarqué mais elle n'est pas déclaré, curieux tu n'évoque pas l'erreur !
    Reprend mon code, j'avais corrigé cela !

    DataPtr est un Pointer, donc void*
    BinToHex ne supporte que char* (les autres versions sont très récentes)
    Il suffit de caster, en plus tu l'avais fait pour *p !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BinToHex((char*)DataPtr, Buffer, DataSize);
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 44
    Par défaut
    Oups j'ai honte Je l'avoue je n'avais que survolé ton code par manque de temps, j'en suis désolé.

    J'ai donc repris tout ça, et en effet, quelques erreurs que tu as cité étaient stupides.

    En revanche, tu dis :

    DataSize-- !
    Déjà tu pourris le paramètre !
    Donc le code que j'ai fourni utilise 0 comme taille de buffer, c'est mal barré !
    C'est la seule chose que je n'ai pas encore arrangée, parce que du coup, des le début du code, je dois mettre le datasize dans une variable pour la réutiliser plus tard et ainsi éviter le soucis avec le DataSize-- de mon code ?


    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
    void __fastcall TForm4::CommPortDriver1ReceiveData(TObject *Sender,
          void* DataPtr, int DataSize)
    {
    //transtypage de la variable DataPtr
        unsigned char *p = (unsigned char*)DataPtr;
        unsigned char c1, c2;
        int test = DataSize;
     
     
        int index = 0;
        //lorsqu'il y a un caractère dans la file d'attente
        while(DataSize > 0)
        {
            DataSize--;
            c1 = p[index++];
     
            valeur[tempo] = c1;
            tempo++;
            if(tempo > (tempo2+14))
            {
                ...
                    }
     
                    tempo2 = tempo2 + 7;
        AnsiString Text;
        Text.SetLength(test);
        CopyMemory(Text.c_str(), DataPtr, test);
        TrameAffiche->Lines->Add(Text);
     
        char* Buffer = new char[test* 2 + 1];
        ZeroMemory(Buffer, test* 2 + 1);
        BinToHex((char*)DataPtr, Buffer, test);
        AnsiString HexaStr = Buffer;
        delete [] Buffer;
     
        TrameAffiche->Lines->Add(HexaStr);
                }
            }
     
     
        }//while
     
    }
    Merci d'avance pour votre patience

    cdt Coxycross

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

Discussions similaires

  1. fonction pour afficher les donnees d'une trame IP
    Par ayoub1989 dans le forum Réseau
    Réponses: 19
    Dernier message: 26/07/2011, 15h26
  2. Réponses: 35
    Dernier message: 17/04/2009, 21h32
  3. Réponses: 6
    Dernier message: 23/11/2008, 11h58
  4. Envoyer une trame "brut"
    Par Snooker9 dans le forum Réseau
    Réponses: 2
    Dernier message: 25/02/2008, 10h26
  5. Réponses: 2
    Dernier message: 04/02/2004, 22h32

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