Pb de réception sur liaison RS232

cs_CTotophe85 Messages postés 1 Date d'inscription mercredi 30 janvier 2008 Statut Membre Dernière intervention 1 février 2008 - 1 févr. 2008 à 20:35
Anguel Messages postés 31 Date d'inscription mardi 8 novembre 2005 Statut Membre Dernière intervention 15 septembre 2011 - 26 août 2008 à 16:44
        Bonjour à tous, j'ai écrit une classe qui me permet de communiquer via une laison RS232 par le port COM, mais bon voilà le problème que je rencontre c'est que je peux utiliser plusieurs fois la méthode pour envoyer les messages mais la méthode pour rcevoir ne marche au'au premier appel, après il la zappe et du coups je ne reçoit plus rien, si quelqu'un à une idée, merci d'avance.

voici le code source:
RS232.h
/*--------------- DECLARATION DES BIBLIOTHEQUES ----------------*/

#include             //flux d'entrée/sortie
using namespace std;
#include        
using namespace std;
#include <stdio.h>
#include <windows.h>
/*--------------------------------------------------------------*/

/******************************************************
\class <RS232>
<Elle permet l'initialisation d'un port pour communiquer via une liaison RS232>
\version 1.0
/////////////////////////////////////////////////////*/
class RS232
{
    /*-------------- Attributs --------------*/
    HANDLE hCom;// le port est référencé avec un identifiant de type HANDLE
    DWORD  NbOctetsEcrits, NbOctetsLu;//indique l’adresse d’un DWORD contenant le nombre d’octets réellement transmis.

    /*-------------- Méthodes ---------------*/
public:
    RS232(unsigned char numPort, unsigned char nbDonnees=8, unsigned char nbStop=1, unsigned char parite=0, unsigned int vitesse=115200);
    ~RS232(void);
    bool envoyerMessage(unsigned char caractere);
    bool recevoirMessage(unsigned char* caractere);

};

RS232.cpp:

#include "RS232.h"

//------------------------- RS232 ----------------------------
/**
\brief Constructeur : initialisation de la communication RS232

\param  numPort: correspond au numéro du port, par exemple 1 pour COM1
        nbDonnees: indique le nombre de donnees à envoyer (7 ou 8 bits)
        nbStop: nombre de bits de stop
        parite: type de parite ('EVENPARITY', 'OODPARITY', 'NOPARITY')
        vitesse:  vitesse de transmission
       
\section Algorithme
*/
//-------------------------------------------------------------
RS232::RS232(unsigned char numPort, unsigned char nbDonnees, unsigned char nbStop, unsigned char parite, unsigned int vitesse)
{
    char nomPort[5];
   
    sprintf(nomPort,"COM%d",numPort);
   

    //----------- Ouverture du port ------------------
    hCom=CreateFile("COM6",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING ,0,NULL);
    if (hCom == INVALID_HANDLE_VALUE)
        exit(0);

    //----------- Configuration du port --------------------
    DCB dcb;    //Cette structure "Device-Control Block" definit l'initialisation d'un périphérique de communications.
           
    if (GetCommState(hCom,&dcb) == false)// Lecture des paramétres physiques.
    {
        exit(0);
    }
    else                                   
    {
        dcb.ByteSize=nbDonnees;                //    -Nombre de bits de Données
        dcb.StopBits=nbStop;                //    -Nombre de bit(s) de Stop
        dcb.Parity=parite;                    //    -Type de parité
        dcb.BaudRate=vitesse;                //    -Vitesse de transfert des données
        SetCommState(hCom,&dcb);            //  Ecriture de ces paramètres.
    }
}

//------------------------- ~Transmission_CANOpen ----------------------------
/**
\brief Destructeur: Fermeture de la connexion avec le périphérique.
                   
\section Algorithme
*/
//---------------------------------------------------------------------------
RS232::~RS232(void)
{
    CloseHandle(hCom);// Fermeture du Handle hCom.
}

//--------------------------- envoyerMessage --------------------------------
/**
\brief : Elle permet d'envoyer un message (un caractere ou une valeur hexdecimale
         sur un octet non signé.

\param CARACTERE: message à transmettre
\return on retourne un booléen qui présise si l'envoie s'est bien passer.
        TRUE: OK.
        FALSE: Un probeme est survenue lors de l'envoie du message
\section Algorithme
*/
//---------------------------------------------------------------------------
bool RS232::envoyerMessage(unsigned char caractere)
{
    return WriteFile(hCom,&caractere,1,&NbOctetsEcrits,NULL);
}

//--------------------------- recevoirMessage --------------------------------
/**
\brief : Elle permet de recevoir un message (un caractere ou une valeur hexdecimale
         sur un octet non signé.

\param CARACTERE: adresse de reception du message
\return on retourne un booléen qui présise si la reception s'est bien passer.
        TRUE: OK.
        FALSE: Un probeme est survenue lors de lla reception du message
\section Algorithme
*/
//---------------------------------------------------------------------------
bool RS232::recevoirMessage(unsigned char* caractere)
{
    return ReadFile(hCom,caractere,1,&NbOctetsLu,NULL);
}

et le main:
void main(void)
{
    unsigned char caractere;
    unsigned char roue_droite=MOTOR_STOP;
    unsigned char roue_gauche=MOTOR_STOP;
   
    RS232 o(6);

    cout << "Que voulez vous faire?" << endl;
    cin  >> caractere;
    cout << "caractere:" << caractere << endl;

    do
    {
        switch (caractere)
            case 'M':
                o.envoyerMessage(COMMANDE_MOTOR);
                SetEvent(event_carac);
                //o.recevoirMessage(&caractere);
                flag=true;

                //COMMANDE ROUE DROITE
                o.envoyerMessage(roue_droite);
                SetEvent(event_carac);
                o.recevoirMessage(&caractere);
                flag=true;

                //COMMANDE ROUE GAUCHE
                /*o.envoyerMessage(roue_gauche);
                SetEvent(event_carac);
                o.recevoirMessage(&caractere);
                flag=true;
            break;

            //default: break;*/

        cout << "Que voulez vous faire?" << endl;
        cin  >> caractere;
    }
    while(caractere!='Q');
}

1 réponse

Anguel Messages postés 31 Date d'inscription mardi 8 novembre 2005 Statut Membre Dernière intervention 15 septembre 2011
26 août 2008 à 16:44
Bonjour
 Je ne peu pas te donner un exemple en C ou C+ mais
en règle général , avant de utiliser les donnes reçu il faut mettre le buffer de la porte a Zéro en Visual Basic  c'est :
MScomm.DiscardInBuffer()

j'espère que ca t'aidera.
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>





Anguel
0
Rejoignez-nous