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 :

open avec comport [FAQ]


Sujet :

C++Builder

  1. #1
    Membre confirmé Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Par défaut open avec comport
    Bonjour à tous !

    Comment puisje faire pour savoir si un port série n'est pas déjà utilisé...

    Je m'explique, j'ai une carte qui me réponds dans le cas où je fais une sorte de ping (c'est moi qui définie le protocole de réponse) donc j'aimerais ouvrir le port 1, envoyer ma trame. Si je n'ai pas de réponse je ferme et passe au port 2 etc.

    Le seul problème : si je tente d'ouvrir un port qui possède déjà sa carte, le programme me renvoie une exception de type EComPort (pour tester, tentez d'ouvrir le port COM auquel est branché votre modem interne par exemple).

    Merci de vos réponses.

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 246
    Par défaut
    Voilà un petit exemple :
    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     AnsiString msg = "";
     
        try
         {
          ComPort1->Connected = true;
         }
        catch(EComPort &e)
         {
           switch(e.Code)
            {
             case CError_OpenFailed  : msg = "Votre port série est déjà ouvert"     ; break;
             case CError_WriteFailed : msg = "Erreur d'écriture sur le port série"  ; break;
             /* voir l'aide de TComPort sur Error codes pour continuer */
            }
          ShowMessage(msg);
         }
    }
    J'éspère avoir répondu à ta question.
    @ bientôt
    Vincent

  3. #3
    Membre confirmé Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Par défaut soucis
    Merci de t'être penché sur mon problème mais j'ai débuggé en mode pas à pas et le programme plante tout de suite après l'instruction qui permet de connecter le port...

    Je donne le code pour être plus clair mais beaucoup ne sers à rien, seulement pour voir si ce n'est pas une exception qui passe au travers
    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
    void __fastcall TApplication_Form::Configuration_ComboBox_configCOMChange(
          TObject *Sender)
    {
     //si le contenu de la boîte de sélection de config du port série
     //contient une info valable alors on enlève l'encadrement rouge
     if( (Configuration_ComboBox_configCOM->Text == "COM1") ||
         (Configuration_ComboBox_configCOM->Text == "COM2") ||
         (Configuration_ComboBox_configCOM->Text == "COM3") ||
         (Configuration_ComboBox_configCOM->Text == "COM4") )
     {
       AnsiString msg = "Message de départ";
     
       Configuration_Shape_configCOM->Visible = false;
       Application_ComPort->Port = Configuration_ComboBox_configCOM->Text;
       try
       {
         Application_ComPort->Close();
         Application_ComPort->Connected = true; [color=red] //le prog plante ici[/color]
       }
       catch(EComPort &e)
       {
         switch(e.WinCode)
            {
              case 1:
                msg = "Votre port série est déjà ouvert";
                break;
              case 2:
                msg = "Problème d''écriture";
                break;
              case 3:
                msg = "Problème de lecture";
                break;
              default:
                msg = "Default de WinCode";
                break;
            }
         switch(e.Code)
            {
              case 1:
                msg = "Votre port série est déjà ouvert";
                break;
              case 2:
                msg = "Problème d''écriture";
                break;
              case 3:
                msg = "Problème de lecture";
                break;
              default:
                msg = "Default de Code";
                break;
            }
       }
     }
     else
     {
       Application_ComPort->Close();
       Configuration_Shape_configCOM->Visible = true;
       Configuration_ComboBox_configCOM->Text = "Choix du port série";
     }
    }
    je ne comprends pas pourquoi il ne cherche pas dans les exceptions (en plus je n'arrive pas à faire marcher un bloc __finally à la fin

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 246
    Par défaut
    Je n'ai pas regardé tout ton code car une chose me semble étrange :
    Je ne vois pas de
    Comment affiches tu le message d'erreur ?

    j'ai débuggé en mode pas à pas
    Dans ce cas c'est normal que l'exeption se produit et si je ne m'abuse C++ Builder te dit, dans une fenêtre :

    Le projet xxx.exe à provoqué une classe d'exception EComPort avec le message 'Unable to open port (win error code: 5)'. Processus stopé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    Car en mode pas à pas ou débuggage C++ Builder t'informe des exceptions déclanchés et ce, même dans un bloque try-catch ou try-__finally etc...

    Pour voir ce qui se passe dans mon exemple il faut mettre un point d'arrêt sur ComPort1->Connected = true; lancer le pas à pas : bien sur on déclanche l'exception en ouvrant un port déjà ouvert. BCB montre la fenêtre d'exception et là tu refait Compiler. Mon exemple te montrera alors la fenêtre "Votre port série est déjà ouvert"

    J'aurai aussi pu faire comme ça (c'est une autre solution qui évite le ShowMessage) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        try
         {
          ComPort1->Connected = true;
         }
        catch(EComPort &e)
         {
           switch(e.Code)
            {
             case CError_OpenFailed  : e.Message  = "Votre port série est déjà ouvert"     ; break;
           //   voir l'aide de TComPort sur "Error codes" pour continuer la gestion des erreurs 
            }                                                                                 
           throw;
         }
    Voilà !

  5. #5
    Membre confirmé Avatar de Goldocrack
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 126
    Par défaut thx
    Pardon de mon ignorance mais je ne fais pas souvent mumuse avec les exceptions

    Merci de m'avoir débloqué, je pense que je devais gérer mes exceptions avant de poser cette question (qui maintenant paraît stupide )

    Pour le ShowMessage je l'avais tout simplement oublié dans le copier coller mais c'est sur il y était dans mon code.

    Longue vie à developpez

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut open comport autre problème
    Bonjour,

    Alors moi j'ai exatement le même problème
    le seul problème : si je tente d'ouvrir un port qui possède déjà sa carte, le programme me renvoie une exception de type EComPort (pour tester, tentez d'ouvrir le port COM auquel est branché votre modem interne par exemple).
    A part que moi j'ai pas une carte mais j'aimerais quand même tester que le port ne soit pas déjà utiliser.

    En + moi j'ai une finesse :

    Alors j'utilise BDS 2006 et j'ai fait une DLL en C++ que je dois appeler avec un programme fait en Delphi.

    C'est dans la DLL que j'ai la gestion du port série. Dans la DLL je met mon try .....catch comme indiqué.

    try
    {
    ComPort1->Connected = true;
    }
    catch(EComPort &e)
    {
    switch(e.Code)
    {
    case CError_OpenFailed : e.Message = "Votre port série est déjà ouvert" ; break;
    // voir l'aide de TComPort sur "Error codes" pour continuer la gestion des erreurs
    }
    throw;
    }
    Le problème qu'il y a c'est que que aprés l'erreur "Unable to open port...." j'ai une autre erreur :

    Erreur d'application

    Exception EComPort dans le module madll.dll dans 000

    Cette erreur viendrait de l'application hôte faite en Delphi et je n'arrive pas à la "catcher" dans ma DLL.

    Mais je n'arrive pad non plus à la catcher dans l'applic hôte car c'est une erreur indiquant que des Exceptin se produisent dans la DLL.

    Est ce que quelqu'un a déjà essayer de faire ce genre de chose ?
    Est ce que c'est possible de "catcher" cette erreur ou de la désactiver ?

    Merci.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut Correction
    Bonjour,

    En fait c'est pas correct ce que j'ai marqué.

    Mais je n'arrive pad non plus à la catcher dans l'applic hôte car c'est une erreur indiquant que des Exceptin se produisent dans la DLL.
    En réalité j'arrive à attrapper l'erreur dans l'applicaton hot Delphi avec un bloc

    try
    .....
    exception
    on E : Exception do
    ShowMessage(
    end;

    Il m'affiche même le message défini dans la DLL.

    Donc j'ai pas vraiment de problème, je m'était mal renseigner.

    Voila

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

Discussions similaires

  1. [debutant] utilisé window.open avec <form>
    Par Bayar dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/08/2006, 13h37
  2. window.open avec deux urls
    Par dehbi dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 22/06/2006, 10h05
  3. window.open avec parametre
    Par loleske dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/11/2005, 10h22
  4. xsl:test .... avec comportement bizarre
    Par Blue LC dans le forum XMLRAD
    Réponses: 2
    Dernier message: 10/06/2005, 13h56
  5. [VB.NET] Form avec comportement msgbox
    Par Berns dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/06/2004, 11h09

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