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

Delphi Discussion :

Composant COMPORT et gestion d'un port série


Sujet :

Delphi

  1. #1
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut Composant COMPORT et gestion d'un port série
    Bonjour à tous,

    J'ai un composant TComport (source forge) me permettant de gérer un port série. Tout va bien sauf, quand je déconnecte mon périphérique de mon port série : Une erreur est générée, j'ai fait l'acquisition de l’exception, pas de soucis, mais quand je rebranche mon périphérique, rien à faire, j'ai droit à l'erreur "PurgeComm function failed" et il faut que je reboute mon programme.
    Puisqu'en reboutant mon programme le port com se remet d'aplomb, c'est que Comport doit garder quelque chose en mémoire ... mais quoi ?
    Comment réinitialiser un composant ?
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    un port Com ça s'ouvre mais il faut aussi ne pas oublier de le refermer avant de fermer le programme.
    Y a t'il une instruction de fermeture du port dans cette gestion de l'exception ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut
    Bonjour SergioMaster,
    Oui, la fonction ferme le port mais ça ne fonctionne pas
    Le programme appelle toutes les secondes la fonction VisuCommunicationPortCom : une chaine est envoyée sur le port com. Si celui ci renvoie une erreur, le flag VisuCommunicationPortComErreur se mets à true, au prochain traitement, le programme demande la déconnection, la fermeture, et la reconnection. Mais ça génère l'erreur "PurgeComm function failed", donc le port ne se ferme pas. Au reboot du programme, tout va bien.

    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
    Function TForm1.VisuCommunicationPortCom:Boolean;
    begin
               Try
                  if VisuCommunicationPortComErreur=true
                  then begin
                       ComPort1.Connected:=false;
                       Comport1.Close;
                       ComPort1.Port:=Label9.Caption; // N° du Port COM
                       Comport1.Open;
                  end;
                  comport1.WriteStr('0Z0Z0Z');
                  Result:=true;
                  VisuCommunicationPortComErreur:=false;
               Except
                     on E: CPort.EComport    
                     do begin
                        Result:=false;
                        VisuCommunicationPortComErreur:=true;
                        ComPortError(E.Code,E.Message,FlagTempoErreur);
                     end;
               End;
    end;
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  4. #4
    Membre régulier

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 185
    Points : 119
    Points
    119
    Par défaut
    Je poursuis mes tests avec le composant COMPORT :
    J'ai créé dynamiquement le composant en me disant que s'il génère une erreur persistante, je n'ai qu'à le détruire et le reconstruire.
    Et ben non, il ne veut pas se détruire (ComPort1.free), il génère une exception et est pris en charge par la gestion des exception ...
    Je vois bien que le sujet ne passionne pas mais si quelqu'un à une idée ...
    Delphi 10.4.1 - Lazarus
    Utilisation de la VCL

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 011
    Points : 2 078
    Points
    2 078
    Par défaut Pb comport
    Bonjour,
    Une idée au Hasard :
    Pour voire ce qui se passe je te propose :
    De mettre deux boutons provisoires
    un pour la fermeture du port (avec une gestion d'erreur) , un pour l'ouverture(avec une gestion d'erreur) et en cas de détection d'une erreur par le programme de visualiser un message sans rien faire. Tu pourras alors manuellement fermer le port puis quelques secondes après le recouvrir.
    Je me demande si l'enchainement de commandes "close" immédiatement suivi de "open" n'est pas ce qui pose probleme ..
    En décomposant tu verras mieux ce qui se passe en particulier si le défaut se produit "en manuel" tu sauras avec certitude si c'est l'ouverture ou la fermeture du port qui pose problème.

    J'ai recherché vite fait le message d'erreur dans le source : a priori c'est une fonction de l'Api Windows qui efface le contenu du buffer (émission (réception ?)
    Peut être que Windows refuse parce qu'il y a un message a émettre (ce que tu envoies pour tester la déconnexion)
    Donc avant le "close" j'essaierai de vider le buffer avec comport.clearbuffer(parametres )

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 852
    Points : 11 285
    Points
    11 285
    Billets dans le blog
    6
    Par défaut
    Si le périphérique est déconnecté (ou reconnecté), lors de l'envoi suivant, n'essaye-t-il pas d'envoyer à un Handle qui n'est plus valide ?
    Je ne sais pas si TComPort.Handle représente le Handle associé au périphérique et qui est transmis à la fonction PurgeComm de l'API Windows.
    Je te suggère de tester la chose en stockant le Handle pour comparer et ne faire le test d'émission dans VisuCommunicationPortCom que 1) s'il n'a pas changé 2) si le statut est Connected.
    Si cela n'évite pas l'exception non gérable, ni la solution de gaby277, ni la création dynamique/libération à chaque test, je ne vois plus quoi faire...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

Discussions similaires

  1. gestion de plusieurs ports série
    Par kouedic dans le forum Windows
    Réponses: 1
    Dernier message: 15/02/2008, 09h10
  2. gestion de plusieurs ports série
    Par kouedic dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 15/02/2008, 08h58
  3. Comport ou autre bibliothèque pour port série ?
    Par giloutho dans le forum Composants VCL
    Réponses: 1
    Dernier message: 13/01/2006, 13h24
  4. [CCom] Gestion du port série
    Par Marthym dans le forum MFC
    Réponses: 6
    Dernier message: 23/11/2005, 09h53
  5. Gestion du port série
    Par Aradesh dans le forum MFC
    Réponses: 5
    Dernier message: 18/10/2005, 16h43

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