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 :

Etat de CTS sur port série


Sujet :

C++Builder

  1. #1
    Juste_Une_IlluZion
    Invité(e)
    Par défaut Etat de CTS sur port série
    Bonjour, j'aimerais savoir comment lire l'état de l'entrée CTS (ou l'entrée DSR) sur mon port série suivant si elle est haute ou basse ?
    merci d'avance

  2. #2
    Membre averti
    Avatar de Neo41
    Inscrit en
    Janvier 2003
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 241
    Points : 403
    Points
    403
    Par défaut
    Bonjour,

    je n'ai pas souvent manipulé les ports série, mais des fois j'utilisais un composant TComPort qui est assez simple pour gérer le port série (surtout basculer le DTR ON/OFF). Je ne sais pas si ca pourrait t'aider.

    Bon courage
    "Don't think you are, know you are..." (Morpheus)

  3. #3
    Juste_Une_IlluZion
    Invité(e)
    Par défaut
    Il existe bien sur un composant se nommant TCommport mais le projet que je suis actuellement en train d'effectuer ne doit pas passer par TCommport (création de mes propres classes RS232 etc ...). Donc pour cela, je cherche à le faire autrement. Je te remercie quand même de ta réponse
    Si quelqu'un a une petite idée ... de mon côté, je continue de chercher.

    ++

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    bonjour,
    Je ne sais pas si cela pourra d’aider


    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include <windows.h>
    #include <assert.h>
    #include <stdio.h>
     
    void main( )
    {
        HANDLE hCom;
        OVERLAPPED o;
        BOOL fSuccess;
        DWORD dwEvtMask;
     
        hCom = CreateFile( "COM1",
            GENERIC_READ | GENERIC_WRITE,
            0,    // exclusive access 
            NULL, // default security attributes 
            OPEN_EXISTING,
            FILE_FLAG_OVERLAPPED,
            NULL 
            );
     
        if (hCom == INVALID_HANDLE_VALUE) 
        {
            // Handle the error. 
            printf("CreateFile failed with error %d.\n", GetLastError());
            return;
        }
     
        // Set the event mask. 
     
        fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR);
     
        if (!fSuccess) 
        {
            // Handle the error. 
            printf("SetCommMask failed with error %d.\n", GetLastError());
            return;
        }
     
        // Create an event object for use by WaitCommEvent. 
     
        o.hEvent = CreateEvent(
            NULL,   // default security attributes 
            FALSE,  // auto reset event 
            FALSE,  // not signaled 
            NULL    // no name
    		);
     
     
        // Intialize the rest of the OVERLAPPED structure to zero.
        o.Internal = 0;
        o.InternalHigh = 0;
        o.Offset = 0;
        o.OffsetHigh = 0;
     
        assert(o.hEvent);
     
        if (WaitCommEvent(hCom, &dwEvtMask, &o)) 
        {
            if (dwEvtMask & EV_DSR) 
            {
                 // To do.
            }
     
            if (dwEvtMask & EV_CTS) 
            {
                // To do. 
            }
        }
        else
        {
            DWORD dwRet = GetLastError();
            if( ERROR_IO_PENDING == dwRet)
            {
                printf("I/O is pending...\n");
     
                // To do.
            }
            else 
                printf("WaitCommEvent failed with error %d.\n", GetLastError());
        }
    }
    Le code permet de déclencher un événement sur le changement d’état du CTS ou DSR

    cordialement

  5. #5
    Juste_Une_IlluZion
    Invité(e)
    Par défaut
    Bonjour,
    merci pour le code mic.29 mais j'ai un petit probleme encore...
    Je lance mon application et j'attend l'event sur CTS mais voilà !!! il y a beau avoir des events sur CTS mais je sors directement de la condition WaitCommEvent. Le dwEvtMask est tjrs à 0 pourtant la sortie RTS est bien haute (+11volts) lorsque je lance mon programme et vu que j'ai fais un "pont" entre RTS et CTS je devrai "voir" l'event sur CTS...
    Voilà où j'en suis ... je cherche ce qu'il ne va pas. Dis moi si tu as déjà essayer ton programme tel quel ??
    merci d'avance pour ta réponse mic.29.
    ++

  6. #6
    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
    bonjour,
    a mon avis dans le code posté précédemment il manque le settings du Comport
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DCB PortSet;
    SetCommState(hCom,&PortSet);
    voir l'aide WIn32 pour les détails sur la structure DCB
    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

  7. #7
    Juste_Une_IlluZion
    Invité(e)
    Par défaut
    Bon, le programme marche pour "voir" un événement mais le CTS ne sais pas exactement si l'évenement est une entrée haute (+12V) ou une entrée basse (-12V), car le truc que j'aimerais c'est :
    lorsque je branche mon câble à ma carte de test, détecter que mon câble est bien en relation avec elle (état haut du CTS) ET AUSSI que le programme détecte lorsque je débranche le câble prématurément(état bas du CTS, avec ouverture d'une messagebox etc ..). Voilà je poste le code dans le cas où le CTS "voit" un évènement (mais distingue pas l'état bas je pense) dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        if (WaitCommEvent(hCom, &dwEvtMask, &o))
        {
            if (dwEvtMask & EV_CTS)
            {
                 Form1->Color=clLime;
            }
            else
            {
                 Form1->Color=clRed;
            }
        }
    la boucle se fais tjrs par même si je débranche le câble

    Bon, je cherche encore et je vous met le code que j'ai fait (il est simple).
    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
     
        HANDLE hCom;
        OVERLAPPED o;
        BOOL fSuccess;
        DWORD dwEvtMask;
        DCB dcb;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
     
     
        hCom = CreateFile( "COM1",
            GENERIC_READ | GENERIC_WRITE,
            0,    // exclusive access
            NULL, // default security attributes
            OPEN_EXISTING, 
            NULL,
            NULL
            );
     
        GetCommState(hCom, &dcb);
        SetCommState(hCom,&dcb);
     
     
        // Set the event mask.
        fSuccess = SetCommMask(hCom, EV_CTS);
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        if (WaitCommEvent(hCom, &dwEvtMask, &o))
        {
            if (EV_CTS)
            {
                 Form1->Color=clLime;
            }
            else
            {
                 Form1->Color=clRed;
            }
        }
        else
        {
            DWORD dwRet = GetLastError();
            if( ERROR_IO_PENDING == dwRet)
            {
                printf("I/O is pending...\n");
     
                // To do.
            }
            else
                printf("WaitCommEvent failed with error %d.\n", GetLastError());
        }
    }
    Allez hopla , je mis remet de suite !!!!

    A++

  8. #8
    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
    bonjour,
    tu vas avoir des problèmes avec ton code
    la méthode WaitCommEvent est bloquante ce qui signifie que tu vas interreomptre la boucle de message windows dans ton applications et qu'elle va se bloquer si aucune activité n'est détectée sur le port
    la méthode WaitCommEvent doit être utilisée dans un Thread séparé
    d'autre part pour détecter un changement d'état dans les 2 sens tu dois
    modifier la structure DCB (Voir aide Microsoft)
    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

  9. #9
    Juste_Une_IlluZion
    Invité(e)
    Par défaut
    merci DjmSoftware de ta réponse déjà
    je sais que WaitCommEvent est blocant mais ce programme c'est un test c'est tout, j'intégrerais par la suite ce bout de prog. dans un Thread dans mon code final
    je vais regarder dans la structure dcb mais je n'ai point vu la fonction qui me permettrais de savoir l'état exact (0 ou 1) de l'entrée CTS (je suis peut être passer à coté tu me diras lol).
    Bon je vais rechercher hopla .
    A ++

  10. #10
    Juste_Une_IlluZion
    Invité(e)
    Par défaut
    Bonjour,

    Bon, finalement j'ai utilisé la méthode avec TCommPort (vu le retard de mon projet). Mais j'aimerais bien savoir le codage sans TCommPort
    Voilà je met le "résolu" quand même ...

    A++

Discussions similaires

  1. [VB6]Réception de données sur port série
    Par lindecker dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 08/03/2006, 06h48
  2. envoi tableau de data sur port série
    Par chourmo dans le forum Langage
    Réponses: 2
    Dernier message: 27/07/2005, 16h23
  3. [C#] lecture sur port série
    Par Iokanaan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/05/2005, 13h50
  4. Recevoir "NULL" sur port série
    Par WinY57 dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 04/03/2005, 11h37
  5. [Débutant] Réception sur port série
    Par Tophe59 dans le forum Langage
    Réponses: 43
    Dernier message: 28/06/2004, 11h04

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