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 :

[Débutant] Lenteur avec TComPort


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 14
    Points : 7
    Points
    7
    Par défaut [Débutant] Lenteur avec TComPort
    Bonjour,

    Pour dialoguer avec un systeme externe (mC), via le port série, nous utilisons le composant TComPort.

    Le principe du protocole de dialogue est un mirroir (chaque octet envoyé est retourné par le mC et nous devons attendre le retour pour envoyer l'octet suivant).

    Nous traitons le dialogue dans l'evènement OnRxChar où nous recevons 1 octet et envoyons immédiatement le suivant ce qui a pour effet d'alimenter constament le dialogue.
    Configuration du port : 19200 bauds, 8 bits, pas de parité et 1 bit de stop.

    Problème :
    Avec cette methode nous mettons 3 ms à renvoyer un caratère après en avoir reçu 1,(Mesures faites à l'oscilloscope) et nous avons l'assurance que le mC réagit immédiatement.

    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
     
    //------------------------------------------------------------------------------
    void __fastcall TForm1::Envoi (__int8 *Octet)
    {
            ComPort1->Write(Octet,1);
    }
    //------------------------------------------------------------------------------
    void __fastcall TForm1::Recoit(__int8 *Octet)
    {
            Form1->ComPort1->Read(Octet,1);
    }
    //------------------------------------------------------------------------------
    void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
    {
            char Octet;
     
            while(ComPort1->InputCount()!=0);
            {
                    Recoit(&Octet);
                    switch (Dialogue.Type)
                    {
                    case 1:
                            switch (Dialogue.Octet)
                            {
                            case 1:  //Reception N° Esclave
                                    Dialogue.Octet=2;
                                    Envoi (&Dialogue.Type);
                                    break;
     
                            case 2:  //Reception Type de dialogue
                                    Dialogue.Octet=3;
                                    break;
     
                            case 3:  //Reception de l'octet d'état
                                    Dialogue.Octet=4;
                                    Canton[Dialogue.Esclave].Etat=Octet;
                                    Envoi(&Octet);
                                    break;
     
                            case 4:  //Reception N° Esclave (Acquittement)
                                    Dialogue.Octet=1;
                                    Dialogue.Esclave=RechercheCantonSuivant(Dialogue.Esclave);
                                    Octet=Dialogue.Esclave|0x80;
                                    Envoi(&Octet); //Relance du dialogue suivant
                                    break;
                            }
                            break;
     
                    case 2:
                    break;
     
                    case 3:
                    break;
     
                    case 4:
                    break;
                    }
            }
    }
    Comment pourrait-on améliorer le programme pour ne pas perdre ces 3 ms qui sont trop pénalisantes pour notre système?

    Nous vous remercions d'avance pour l'intérêt que vous voudrez bien porter à ce post et pour les solutions que vous pourrez y apporter.

    PhDt

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Comment pourrait-on améliorer le programme pour ne pas perdre ces 3 ms qui sont trop pénalisantes pour notre système?
    Si vous recherchez vraiment les performances , il va falloir investir dans de la recherche et développement
    Première méthode qui ne coûte pas vraiment grand chose.
    Avoir recours à un thread pour l'envoi/réception de données avc la classe TThread. Voir dans l'aide de C++ Builder sinon il ya un exemple d'utilisation des TThread sur le CD d'installation ( sinon peut-être qu'ici sur developpez.com aussi )
    L'avantage de l'utilisation d'un thread est qu'on puisse lui attribuer une priorité plus élevée qu'à un autre processus.
    Donc l'OS accorde plus de tranches CPU/système qu'un autre programme
    outrepasser le composant tout fait.
    Le problème avec les composants tout-fait c'est que si on est pointilleux sur les performances ( ce qui est le cas ici ) on arrive vite à leurs limites ...
    Donc développer éventuellement un Device Driver personnalisé avec le DDK car un Device Driver est exécuté dans une couche en-dessous de l'OS ou utiliser des API bas-niveau.

    Ou sinon......prendre un autre OS car un temps de réponse 1ms à atteindre avec MS Windows je sais pas si c'est toujours faisable.
    Peut-être Windows XP Embedded , Linux, QNX ?????......

  3. #3
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Bonjour,

    Pour le thread, le composant TComPort est déjà basé sur un thread. Donc je ne penses pas que ce soit le point à mettre en oeuvre.

    Cordialement,

    Arnaud

  4. #4
    Membre chevronné
    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
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    est tu bien sur de tes mesures
    à 19200 Bauds ,le temps moyen de transmission d'un caractère dans ston cas de figure est de 9* (1/19200) = ~'0.5ms
    le temps de transmission doit donc être de 2 fois cette valeur
    ton programme ou composant prendrait donc 2 ms pour le traitement
    cela me paraît beaucoup

    place dans ton code des appels à GetTickCount() pour voir ou le programme
    prend un maximum de temps

    tu peux les placer par exemple dans l'apppel à Envoi et Recoit
    et créer une méthode appelée avec un PostMessage qui de calcule le temps entre les 2 appel donce entre l'émission et la réception du caaractère

    Cordialement
    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

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Merci à Arnaud pour la précision ( concernant l'utilisation des threads)
    En complément à l'utilisation de GetTickCount proposée par DjmSoftware,
    l'utilisation d'un "profiler" ne serait peut-être pas superflue...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous et un grand merçi pour vos réponses,

    Avant toute chose, je dois vous dire que le projet que nous développons doit gérer en temps reel des mobiles qui sont détectés par des cartes munies de mC (Au total 100 cartes soit 100 esclaves reliés à un PC maître par la liaison série).

    Je vais essayer de faire le point de nos recherches suite au post de mat.M.

    1) les Thread
    Nous avons essayé de donner une priorité supérieure au dialogue de 3 façons:

    1.1) TComPort implémant lui-même des thread, nous avons essayé de donner en priorité supérieure aux thread du composant en utilisant
    ComPort1->EventThreadPriority=tpTimeCritical;

    1.2) Nous avons créer un thread (Priority tpTimeCritical) utilisant le TComPort

    1.3) Nous avons aussi créer un thread sans le TComPort mais un HANDLE en utilisant CreateFile(...),ReadFile(...),WriteFile(...)

    Pour ces 3 méthodes, les mesures à l'ossilloscope sont les mêmes, nous constatons le temps de réponse de 3ms ce qui tend donner raison à la remarque de Greybird.

    2)Changer d'OS
    Le projet que nous développons fonctionne actuellement sous DOS et je dois dire qu'effectivement nous avons du travailler (détournement et reecriture de la fonction d'interrution).

    Les mesures faites sous DOS font apparaitre un temps de réponse de 0,8ms maxi compte tenu de la précision de notre appareil de mesure ce qui s'approche de la théorie exposée par DjmSoftware mais le constat est que nous passons quasiment 4 fois plus de temps dans les dialogues.
    Cette lenteur ne semble pas due à TComPort mais à windows.

    En fait nous souhaitons passer sous windows pour moderniser l'interface utilisateur et surtout pour bénéficier une exploitation en réseau.

    3)Ecrire un driver spécifique
    C'est une solution tentante mais là nous sommes un peu court ...
    Un petit coup de pouce nous serait utile pour démarrer.

    Merçi encore à tous, ce forum est une reelle mine d'or pour nous.

    PhDt

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    N'est ce pas plutôt un problème avec les "timeouts".
    C'est les temps entre les lectures écritures. Pour plus de renseignement, regarder l'aide du composant et il y a quelques spécialiste de comport sur le forum.
    Il n'y a aucun problème de rapidité avec ce composant sous windows normalement s'il est bien paramètré.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merçi pour ta réponse gandf, nous allons chercher.
    Mais ce qui m'étonne, c'est qu'avec des ReadFile et des WriteFile, nous obtenons exactement les mêmes résultats.

    Cordialement,

    PhDt

  9. #9
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Parce qu'il y a aussi moyen de les changer ces timeouts mais je ne sais pas faire sans le composant. Mon prof d'élec m'avait vaguement expliqué il y a quelques années mais je n'ai rien compris.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Dans le composant TComPort, il y a des timeouts
    -ReadInterval
    -ReadTotalConstant
    -ReadTotalMultiplier
    -WriteTotalConstant
    -WriteTotalMultiplier

    J'ai essayé de faire des changement mais cela n'as rien changé.

    Cordialement,

    PhDt

  11. #11
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Il faut pas faire n'importe quoi sinon ça ne marche pas. Il faut lire la doc (qui est en anglais) pour comprendre à quoi ça sert. Ne met pas tout à 0.

  12. #12
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    Quel est le processeur du PC ?

    Quelle est sa fréquence ?

    Quel est l'OS ?

    Est-ce que le code est compilé avec les directives de compilation "rapides"
    avec les symboles ?

    Cordaielement
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    nous avons essayé l'exe sur un P2 et un Athlon 2000+. Les deux machines tournent sur W2k Pro.
    Côté RS232, c'est la même chose.

    Quant aux directives de compilation, nous sommes dédutants et nous n'y avons pas touché. Si tu connais un tuto merçi de nous poster un lien.

    Cordialement,

    PhDt

  14. #14
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    http://www.gandfweb.net/logiciels.htm

    source de RS232Monitor.
    Le programme de fonctionne pas bien mais on peut changer les timeouts (ils ont des valeurs par défaut).
    Je l'ai fait quand j'apprenai à programmer et il n'est pas très bien écrit.

  15. #15
    Membre chevronné
    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
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Hello,
    pour faire suite
    je ne suis toujours pas convaincu que ce soit windows qui ralentissse ton application
    pour l'essayer puis que ton (mC), te renvoie une copie du caractère envoyé utilise un câble modem qui simulera ton mc
    place ton câble NULLMODEM entre les 2 Ports Com Standard d'un PC
    lanece 2 sessions de ton progrmme une fois avec le port com1 et une fois avec le port COm2
    mesure avec ton oscillo les pts TXD et RXD.

    en principe sur un port série si le câble n'et pas trop long on peu arriver à une transmission de 256Kbauds avec des cartes d'inerfaces modernes.

    je pense dans ton cas que le problème se situe dans le protocole employé
    il serait peu-être utile de travailler avec des paquets de données séparée par un STX et un ETX de cette manière tu utilse les buffers internes d'emission et de réception des ports

    dans ce cas l'evenemment OnChar se produira moins souvent
    tu peux également modifier la priorité de ton process en la positionnant à TimeCritical , si tu choisi cette solution crée de préférence une application de type service

    cordialement
    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

  16. #16
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    La vitesse de transmittion est relié au temps que dure un bit et les timeouts règle les temps entre 2 octets.

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour DjmSoftware

    Nous allons essayer tout cela samedi (Le projet que nous developpons est dans un milieu associatif, je n'ai pas de maquette chez moi ni d'ossillo).
    je pense essayer aussi avec un bouchon sur un port.

    Quant à la transmission par paquet, le mC que nous utilisons possède un buffer de réception de 2 octets. A voir car nous travaillons aussi sous interruption. A tester entre 2 PC avant car la programmation en assembleur du mC vas être plus compliquée.

    Je te tiens au courant de nos résultats à partir de samedi soir.

    Cordialement,

    PhDt

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour gandf,

    Merci pour tes sources (sympa ton site)

    Je suis sous BCB6 donc j'accepte la conversion, mais à la compilation il me manque 2 hpp
    [C++ Error] Unit2.h(10): E2209 Unable to open include file 'CurrEdit.hpp'
    [C++ Error] Unit2.h(11): E2209 Unable to open include file 'ToolEdit.hpp'
    ...
    Sinon l'exe fonctionne je fais des essais samedi et je te tiens au courant.

    Cordialement,

    PhDt

  19. #19
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Je viens de tester la durée de reception entre un PC est une carte bancaire sur un débit de 9600 bps. Le fait de lire 200 octets d'affiler via ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    long A = GetTickCount();
     
      do
       {
        ComPort1->Read(ptrs, 1);
        V += (IntToHex((InversProto(ptrs)), 2)+ " ");
       }
      while (ComPort1->InputCount () > 0);
     
     Memo1->Lines->Add (GetTickCount() - A);
    dure 9ms

    Donc je rejoins l'avis de DjmSoftware, ce n'est peut être pas dut à l'OS. Moi je pencherai plus sur tes cartes micros ???
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  20. #20
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    C'est parce que j'ai utilisé des composants qui ne sont pas livré en standard avec C++Builder et le programme a des bugs.
    C'est quoi le microcontrôleur de ta carte? Tu es sur que le programme de ta carte est bien écrit?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] Lenteur de completion avec les .jsp
    Par Rakken dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 20/12/2007, 14h06
  2. [CR 7] [débutante] pb avec if then else
    Par xs_nady dans le forum Formules
    Réponses: 8
    Dernier message: 28/05/2004, 15h36
  3. [débutant] Prob avec Tree ctrl
    Par Devether dans le forum MFC
    Réponses: 3
    Dernier message: 24/03/2004, 11h36
  4. Reception avec Tcomport
    Par web-angel dans le forum C++Builder
    Réponses: 16
    Dernier message: 27/01/2004, 16h20
  5. [débutant] Problèmes avec CRegKey
    Par Pedro dans le forum MFC
    Réponses: 4
    Dernier message: 10/11/2003, 15h28

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