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++ Discussion :

ouverture du port série en c++


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Points : 46
    Points
    46
    Par défaut ouverture du port série en c++
    pour les besoins de mon application, je cherche le moyen d'initialiser une ouverture au port série via RS232 et d'afficher un message qui me prévienne si l'ouverture a été faite ou pas.
    je sais qu'il faut passer par un fichier (je ne sais pas pourquoi) et qu'il faut utiliser la fonction createfile() mais je ne sais pas comment faire
    et puis j'au vu qu'il faut utiliser la variable dcb... à quoi elle sert...
    je m'enbrouille...
    aider moi
    merci bp
      0  0

  2. #2
    Membre actif Avatar de Jean_Benoit
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 499
    Points : 234
    Points
    234
    Par défaut
    http://electrosofts.com/serial/
    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
    #include <bios.h>
    #include <conio.h>
    #define COM1       0
    #define DATA_READY 0x100
    #define SETTINGS ( 0x80 | 0x02 | 0x00 | 0x00)
    int main(void)
    {
       int in, out, status;
       bioscom(0, SETTINGS, COM1); /*initialize the port*/
       cprintf("Data sent to you:  ");
       while (1)
       {
          status = bioscom(3, 0, COM1); /*wait until get a data*/
          if (status & DATA_READY)
               if ((out = bioscom(2, 0, COM1) & 0x7F) != 0)  /*input a data*/
                  putch(out);
               if (kbhit())
               {
                  if ((in = getch()) == 27)   /* ASCII of Esc*/
                     break;
                  bioscom(1, in, COM1);   /*output a data*/
               }
       }
       return 0;
    }
    A ta disposition si tu as besoin de traduction
      0  0

  3. #3
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Fait une recherche dans les forums et dans la FAQ VC++.
      0  0

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Points : 46
    Points
    46
    Par défaut
    Merci pour ta réponse, mais je ne comprend pas vraiment le code.
    je préfère passer par createfile().
    j'ai besoin de savoir que fait cette fonction exactement.
    je l'ai utilisé mais je n'arrive pas à ouvrir le port, est ce qu'il faut l'utiliser avec d'autres fonction...
    je vous envoie mon code :

    void comPort::OpenPort(char *strPort,long BaudRate,int BitsSize,int Parity,int StopBits)
    {
    // on ouvre le port série
    m_hCom = CreateFile(strPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING,NULL);
    if(m_hCom == INVALID_HANDLE_VALUE)
    {
    // Echec
    cout<<"erreur d'initialisation du port serie"<<endl;
    }
    else
    { cout<<"succes de l'initialisation du port serie"<<endl;
    }


    }
    aider moi, toute information est la bienvenue.
    très bonne journée
      0  0

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Utilise les balises CODE.
    Il y a un exemple complet avec CreateFile dans la FAQ VC++.
      0  0

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Points : 46
    Points
    46
    Par défaut
    merci de me répondre...
    je ne comprend pas ce que sont les balises CODE et à quoi ça me servirait de les utiliser...
    j'ai besoin surtout de savoir pourquoi mon code me renvoie "erreur de l'initialisation du port série"...
    merci pour le lien je vais y jeter un coup d'oeil...
      0  0

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Les balises CODE sont expliquées dans les règles:
    http://club.developpez.com/regles/#L3.4
    il te suffit de cliquer sur le bouton juste au dessus quand tu réponds.

    Note aussi que c'est spécifique Windows, donc ici ce n'est pas le meilleur forum.
      0  0

  8. #8
    Membre actif Avatar de Jean_Benoit
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 499
    Points : 234
    Points
    234
    Par défaut
    - Quel est l'accessoire avec lequel tu veux faire communiquer ton PC?
    ---- Vois tu des diodes LED?, parfois le PC reste muet mais les diodes commencent à clignoter.(RS232, c'est le serial qui leurre)
    - Il faut définir les vitesses de communication (sortie et entrée) ( les minitels communiquent en 75/1200) et elle doit être la même des deux côtés
    - Selon le signal que tu veux faire passer, il faut choisir PAIR ou IMPAIR ( odd, even), un stop bit. Les arguments de ta fonction sont trés clairs.

    - Si tu as la possibilité, commence par établir la communication en BASIC, c'est beaucoup plus simple, aprés tu pourras reprendre les paramètres en C++.
      0  0

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Points : 46
    Points
    46
    Par défaut
    Merci de m'avoir répondu.

    je t'envoie ma définition de la classe qui amorce l'ouverture du port série :

    int l_serie::InitComPort(char* port, char* parite, int vitesse, int data, int stopBit)
    {
    DCB dcb;
    HANDLE hCom;
    DWORD dwError;
    BOOL fsuccess;

    /////Ouverture du port/////////
    hCom= CreateFile (port,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

    //////Verifier si le handle a été ouvert /////////////
    if (hCom=INVALID_HANDLE_VALUE)
    { cout<<"erreur d'initialisation du port"<<endl;}

    //////Lecture configuration initiale////////
    fSuccess =GetCommState(hCom,&dcb);
    if(!fSuccess)
    {cout<<"erreur lecture configuration"<<endl;
    }

    ///////configuration du port série////////////
    /* Gestion de la vitesse */
    dcb.BaudRate =vitesse;
    /* Gestion du nombre de bits */
    dcb.ByteSize = data;
    /* Gestion de la parité */
    if (strcmp(parite,"Aucune")==0)

    dcb.Parity = NOPARITY;

    if (strcmp(parite,"Paire")==0)

    dcb.Parity = EVENPARITY;

    if (strcmp(parite,"Impaire")==0)

    dcb.Parity = ODDPARITY;

    /* Gestion du Stop Bit */

    if (stopBit==1)
    dcb.StopBits = ONESTOPBIT;
    if (stopBit==1.5)
    dcb.StopBits = ONE5STOPBITS;
    if (stopBit==2)
    dcb.StopBits = TWOSTOPBITS;
    dcb.DCBlength;
    dcb.BaudRate;
    dcb.fBinary=1;
    dcb.fParity=0;
    dcb.fOutxCtsFlow=0;
    dcb.fOutxDsrFlow=0;
    dcb.fDtrControl=0;
    dcb.fDsrSensitivity=0;
    dcb.fTXContinueOnXoff=0;
    dcb.fRtsControl=0;

    /*-----------------------------------------------*/
    /* Configurer le port */
    /*-----------------------------------------------*/
    fSuccess = SetCommState(hCom, &dcb);
    if (!fSuccess)
    {
    cout<<"erreur lors de la configuration du port"<<endl;
    }

    return(0);

    }


    Comme tu voit, je pense qu'elle est bien définie?
    mon programme me renvoit les 3 messages d'erreur!!!

    Je n'ai aucun périphérique branché au port série de mon ordinateur, c'est pour le boulot et on ne m'a pas encore fournit le matériel, est ce que tu me confirme que je ne peux pas tester l'ouverture de mon port série sans matériel branché...
    Je suis novice dans ce genre d'application.

    Merci bp et bonne journée
      0  0

  10. #10
    Membre actif Avatar de Jean_Benoit
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 499
    Points : 234
    Points
    234
    Par défaut
    Déjà une première chose que tu peux faire demain c'est rue Montgallet acquérir des câbles série, parcequ'il existe le branchement direct et/ou le null modem, je ne sais pas trop, à l'époque les prises série étaient assez grandes pour faire les soudures soi-même aprés test.
    Ensuite essaie de trouver un vieux modem US Robotics ou autre, avec des leds, peu importent les vitesses, parceque là tu peux voir sans communication si le modem s'initialise, il y un langage de modems genre NZ qui renvoie des signaux que tu peux récupérer.

    A savoir que les anciens PC avaient les ports COM1 COM2 COM3 COM4 pour les interfaces séries, je ne sais pas ce qu'il en reste aujourdh'ui.

    Je me demande même si on ne pourrait pas lancer une commande DOS c:>copy con COM1, faudrait voir.

    D'aprés ton source, je dirais qu'une bonne moitié n'est pas trés utile (à moins que ce soit trés pointu sur la gestion mémoire et les temps de réponse, genre informatique embarquée).

    Sinon tu pourrais essayer de récupérer les on clicks d'une souris sur le port série (ça existe encore, je m'en sers pour ma Debian box).

    A+
      0  0

  11. #11
    Membre habitué Avatar de BertrandA
    Inscrit en
    Août 2003
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 170
    Points : 197
    Points
    197
    Par défaut
    1) Merci d'utiliser les balises codes, cf les posts d'Aurelien
    2) C'est pas le bon forum, cf le 2ème post d'Aurelien
    3) Dans la FAQ VC++ se trouve une classe qui fonctionne très bien et qui correspond exactement à ton problème, cf le 1er post d'Aurelien
    4) Jean-Benoit essaye de t'aider et c'est tout à son honneur, malheureusement CERTAINS de ses conseils ont 15 ans de retard et ne te seront d'aucune utilité sous Windows
    5) Un appel à GetLastError() te renseignera sur ce qui ne colle pas. A priori tu passes n'importe quoi à ta fonction, mais comme il manque la moitié du code, difficile de deviner.
      0  0

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Rien à ajouter, à part fermeture du topic.
      0  0

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/07/2008, 10h42
  2. ouverture port série?!
    Par Malek_BAKLOUTI dans le forum Composants
    Réponses: 2
    Dernier message: 04/05/2006, 11h06
  3. problème ouverture de port série
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 26/04/2006, 16h42
  4. ouverture d' un port série
    Par stgi02 dans le forum MFC
    Réponses: 3
    Dernier message: 07/03/2006, 11h31

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