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 :

communication serie rs232 en c++ MFC


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut communication serie rs232 en c++ MFC
    Bonjour,
    Je souhaite faire un programme en console en utilisant MFC pour envoyer et recevoir des données par une liaison rs232.
    Pour cela j'ai besoin d'une classe PortSerie et utiliser ses méthodes .
    J'ai commencé la classe mais elle est imcomplète et j'aurait besoin d'aide pour la terminer .


    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
    /******************************************************************/
    // Portserie.h: interface for the CPortserie class.
    //
    ////////////////////////////////////////////////////////////*//////////
    //les codes d'erreurs sur la liaison série
    typedef enum
    {
    RS_ERROR_NOERROR = 0,
    RS_ERROR_OPEN = -10,
    RS_ERROR_INIT = -11,
    RS_ERROR_TX = -20,
    RS_ERROR_RX = -30,
    RS_ERROR_RX_READ = -31,
    RS_ERROR_RX_READ_COMPLETE = -32,
    RS_ERROR_NORESPONSE = -33,
    RS_ERROR_TIMEOUT = -34,
    RS_ERROR_PARITY = -35,
    RS_ERROR_FRAMING = -36,
    RS_ERROR_OVERRUN = -37,
    RS_ERROR_RXOVER = -38,
    }Erreur_T;
     
    class CPortserie
    {
    public:
     
    void OuvreToi(CString nom);
    void ConfigureToi(int vitesse, BYTE nbBits, BYTE parite, BYTE nbStopBits);
    void ReglerTimeout();
     
    bool Emet(char* MessageEnvoi,UINT TailleMessageEnvoi);
    bool Recoit(char* MessageReception,UINT TailleMessageReception);
    Erreur_T ConfigureToi(int vitesse, BYTE nbBits, BYTE parite, BYTE nbStopBits);
     
    CPortserie();
    virtual ~CPortserie();
     
    private:
     
    HANDLE hcom;
    DCB dcb;
    COMMTIMEOUTS timeout;
    bool fSuccess;
    Erreur_T Erreurs;
     
    protected:
    };
     
    #endif // !defined(AFX_PORTSERIE_H__076AC32C_029F_4363_885B_FE72493456*D3__INCLUDED_)

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour et bienvenu,
    Qu'est ce qu'il te manque au juste?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut communication série
    merci de s'interresser en fait il faut qu'en utilisant une classe port serie je puisse communiquer avec un module et j'ai besoin d'aide pour la classe et les methodes

  4. #4
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    On ne va pas faire la classe à ta place.

    Par contre, on peut t'aider et te guider si tu détailles un peu plus ton problème.

    Ton problème se situe à quel niveau ?
    - conception de la classe ?
    - implémentation des méthodes de la classe ?

    Dans le premier cas, il faut que tu détailles le besoin auquel doit répondre ta classe :
    - communication générale avec un port série
    - besoin spécifique, implémentation d'un protocole de com avec un équipement

    Dans le deuxième, il faut que tu détailles ce qui te bloque. Communication avec le port ? Langage C++ en général ?

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    L'interface de ta classe est déjà bien partie, puisque tu as de quoi l'ouvrir, la configurer, envoyer, recevoir. Ce qu'il peut manquer: c'est de fermer, c'est de trancher si les envois et les réceptions sont bloquants ou pas, et s'ils ne sont pas bloquant, c'est comment notifier de la fin de l'opération. Enfin, il y a peut être quelque chose autour de l'erreur (erreur d'envoi, de réception ou erreur qui survient pendant que tu ne fais rien sur l'interface).
    Tu as (presque) toute ta définition, qu'en est-il de l'implémentation ?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut communication serie rs232
    merci, j'ai améliorer mon code et je peut maintenant communiquer avec mon module, mon probleme est le message que j'anvoi actuellement n'est que "at" et je ne peut pas envoyer des chaines en tant que commande.
    voila mon code :

    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
    class CPortserie  
    {
    public:
    	CPortserie();
    	virtual ~CPortserie();
     
    	void OuvreToi(char* nomPort);
    	void ConfigureToi(DWORD vitesse,BYTE nbBits, BYTE parite, BYTE nbStopBits);
    	void ReglerTimeout();
     
    	void Emet(char* MessageEnvoi);
     
    	void Recoit(char* MessageReception);
     
    private:
     
    	HANDLE hcom;
    	DCB dcbb;
    	COMMTIMEOUTS  timeout;
    	bool fSuccess;
    	Erreur_T Erreurs;
    };
    /*******main**********/
    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
     
    	{
     
    	char port[] = "COM1";
    	char Message1[] = "at\r";
    	char reponse[]=""; 
     
    	CPortserie connexion;
     
    	connexion.OuvreToi(port);
     
    	connexion.ConfigureToi(CBR_115200,8,NOPARITY,ONESTOPBIT);
     
    	connexion.ReglerTimeout();
     
    	connexion.Emet(Message1);
     
    	connexion.Recoit(reponse);
     
    	}
    /******Fonctions********/
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
     
    	HANDLE hcom;
    	bool fSuccess;
    	DCB dcb;
    	COMMTIMEOUTS  timeout;
     
     
    CPortserie::CPortserie()
    {
     
     
    }
     
    CPortserie::~CPortserie()
    {
     
    }
     
    void CPortserie::OuvreToi(char* nomPort)
    {
     
     hcom = CreateFile( nomPort,
                         GENERIC_READ | GENERIC_WRITE,
                         0,    // comm devices must be opened w/exclusive-access
                         NULL, // no security attributes
                         OPEN_EXISTING, // comm devices must use OPEN_EXISTING
                         0,    // not overlapped I/O
                         NULL  // hTemplate must be NULL for comm devices
                         );
     
      if (hcom == INVALID_HANDLE_VALUE) {
          // Handle the error.
          printf ("CreateFile failed with error %d.\n", GetLastError());
        //  return (1);
        }
    }
     
    void CPortserie::ConfigureToi(DWORD vitesse,BYTE nbBits, BYTE parite, BYTE nbStopBits)
    {
     
      // We will build on the current configuration, and skip setting the size
      // of the input and output buffers with SetupComm.
     
    	fSuccess = GetCommState(hcom, &dcb);
     
      if (!fSuccess) {
          // Handle the error.
          printf ("GetCommState failed with error %d.\n", GetLastError());
    //      return (2);
        }
     
      // Fill in the DCB: baud=115200 bps, 8 data bits, no parity, and 1 stop bit.
     
      dcb.BaudRate = vitesse;     // set the baud rate
      dcb.ByteSize = nbBits;             // data size, xmit, and rcv
      dcb.Parity = parite;        // no parity bit
      dcb.StopBits = nbStopBits;    // one stop bit
     
      fSuccess = SetCommState(hcom, &dcb);
     
      if (!fSuccess) {
          // Handle the error.
          printf ("SetCommState failed with error %d.\n", GetLastError());
    	//return (3);
        }
     
      printf("\n Configuration OK \n\n");
     
    }
     
    void CPortserie::ReglerTimeout()
    {
            timeout.ReadIntervalTimeout=0;
            timeout.ReadTotalTimeoutMultiplier=2;
            timeout.ReadTotalTimeoutConstant=100;
            timeout.WriteTotalTimeoutMultiplier=0;
            timeout.WriteTotalTimeoutConstant=0;
     
      fSuccess = SetCommTimeouts(hcom, &timeout) ; // time-out values
     
        printf("\n Timeout OK \n\n");
    }
    void CPortserie::Emet(char* MessageEnvoi)
    {
     
    	DWORD NombredeCaracteresEcrits;
    	DWORD NombredeCaractereslus;
     
        WriteFile( hcom, MessageEnvoi, strlen(MessageEnvoi), &NombredeCaracteresEcrits, NULL);
     
    	  printf("\n Message Envoye : %s \n\n",MessageEnvoi);
    }
     
    void CPortserie::Recoit(char* MessageReception)
    {
    	DWORD NombredeCaractereslus;
     
    	ReadFile( hcom, MessageReception, 2, &NombredeCaractereslus, NULL);
     
    	ReadFile( hcom, MessageReception, strlen(MessageReception), &NombredeCaractereslus, NULL);
     
     
    	printf("\n reponse :%s  \n\n\n",MessageReception);
     
    }

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Peux-tu utiliser la STL? Si c'est le cas, je te conseillerais d'utiliser des conteneurs existant comme std::string (ou std::stream).

    Quelques conseils :
    1/ Tu devrais initialiser tes variables membres dans le constructeur (l'utilisation d'une variable non initialisée est indéterminée).
    2/ Je ne vois pas trop le sens de fsucces comme variable membre. S'il s'agit uniquement de récupérer l'état d'erreur au moment de l'appel d'une fonction Win32, une variable locale suffit. S'il s'agit de maintenir un état d'erreur dans ta classe, celui-ci n'est nullement exploité...
    3/ C'est pareil pour dcb et timeout. Telle que tu présentes ta classe, il pourrait uniquement être en variable locale des méthodes qui les utilisent.
    4/ Je pense que c'est une petite erreur de copier/coller, mais la variable DWORD NombredeCaractereslus; de Emet ne sert à rien.
    5/ Le paramètre MessageEnvoi devrait être const. Car à priori, tu ne souhaites pas en modifier le contenu.
    6/ Pour la réception, Recoit devrait aussi prendre en paramètre la taille de MessageReception. En théorie ta première lecture et en pratique ta seconde lecture risque fort de planter car tu ne maîtrise pas la taille de MessageReception
    7/ Autant on peut imaginer que pour l'envoi ce n'est pas gênant, autant pour la réception l'absence de statut d'échec rend ton interface peu utilisable. On ne sait pas dire si à la sortie de la fonction, le buffer de réception contient une donnée valide ou non.
    8/ Quand tu écris char Message1[] = "at\r";, tu créés un tampon (Message1) de 4 octets 'a', 't', '\t' et '\0'. Il est clair que tu ne peux pas mettre plus de données dedans pour envoyer plus de données, il faut - compte tenu de ton interface - que tu créés les tampons qui vont bien.
    9/ Dans la même veine, char reponse[]=""; te crée un tampon de 1 octet ('\0'). Donc comme à la réception du demande à minima 2 octets ->
    De ces deux dernières remarques, je pressent que tu ne maîtrise pas les tableaux et les chaînes de caractère. Fais un petit tour du côté des tutos pour réviser tout ça.
    Bon courage.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut communication serie rs232
    ok merci pour tes remarques, je vais revoir tout sa.

Discussions similaires

  1. communication sur un port Serie (Rs232)
    Par elgaied dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/04/2010, 14h03
  2. communication port RS232 ( serie)
    Par sylvain_bos dans le forum C++
    Réponses: 22
    Dernier message: 11/03/2009, 20h11
  3. Problème de communication Serie rs232
    Par marcootz dans le forum C++
    Réponses: 5
    Dernier message: 14/04/2008, 18h33
  4. Besoin de communiquer avec un port serie RS232 ?
    Par MonsieurAk dans le forum Linux
    Réponses: 2
    Dernier message: 01/02/2006, 17h13
  5. [TP] port série rs232
    Par cyb33 dans le forum Turbo Pascal
    Réponses: 44
    Dernier message: 13/01/2003, 15h49

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