Évenement port série

Soyez le premier à donner votre avis sur cette source.

Vue 13 620 fois - Téléchargée 76 975 fois

Description

J'ai vu presque tous les codes sur cppfrance qui traîte le port série, mais la gestion du port est généralement mal faite alors j'ai voulu contribuer par cette classe qui un peut plus complète en traîtant les événements du port, j'éspère que sa va aider quelqu'un !
voilà la classe comment elle est définie mais vous trouvez tous dans les fichiers

Source / Exemple :


// SerialCom.h

#if !defined(AFX_SERIALCOM)
#define AFX_SERIALCOM

#if _MSC_VER > 1000
#pragma once
#endif 

// _MSC_VER > 1000

// Farscape-dev@Tiscali.fr : Classe Mininum gestion port série.
// Release du 01/11/2004: Met private le constructeur de copie et l'operateur d'affectation.
// Release du 05/05/2004 :Gestion d'un thread de reception des données
// rajoute les fonctions suivantes:
//
//   void SetParentNotify(CWnd *pParent){m_pParent=pParent;}
//   bool PurgeCom();
//   boolPurgeRx();
//   boolPurgeTx();
//   bool StartThread(CWnd *pParent);
//   boo lResumeThread();
//   bool StopThread();
//   bool SetTimeouts(DWORD dwRxTimeout=5000,DWORD dwTxTimeout=5000);  
//   virtual void OnError(DWORD dwError);
//   bool IsRXEmpty();
//   Modifications et correction de :
//   bool  WaitCommEvent(DWORD &rEvtMask);

#define XON  17
#define XOFF 19

// messages à destination de la fenêtre de traitement.

#define WM_CCOMRCV   WM_USER+100 // réceptions sur la voie série
#define WM_CCOMEVENT WM_USER+101 // evénements sur la voie série.
#define WM_CCOMERROR WM_USER+102 // erreurs sur la voie série.

class CCom
{
public:
	void ThreadEcriture();
	void EnvoiMessage(int num_message);
   CCom();
   ~CCom();

   // ouverture du port série
   bool  PortOpen(int portnumber,long baudrate,char parity,int wordlength,int stopbits);
   // réglage vitesse ,parité ,longueur de la data et du bit de stop.
   // ex : 1 : Com1 , ?N? :none , 8 : data 8 bits ,   1 ou 2 : bit de stop
   bool  PortSet(long baudrate,char parity,int wordlength,int stopbits);

    //  Fermeture du port.
   bool  PortClose();

   // Envoie d?une chaîne de caractères la longueur est facultative si elle se termine par ?\0?
   bool  WriteBuffer(const char *buffer,unsigned int ucount=0);

   // lecture d?une chaîne de caractères d?une taille donnée.
   // GetCountRead() contiendra la taille reellement lue .
   int   ReadBuffer(char *buffer,unsigned int ucount);

   // lecture d'un charactere.
   bool ReadChar(char &rchar);

   // Réglage du mode de communication XON/XOFF
   bool  UseXonXoff(bool bEnable=true);

   // Réglage du mode de communication Rts/Cts
   bool  UseRtsCts(bool bEnable=true);

   // Réglage du mode de communication Dtr/Dsr
   bool  UseDtrDsr(bool bEnable=true);

   // Renvoie le nombre d'octets dans le buffer de reception avant lecture
   long SizeUsedInRXBuf();              

   // renvoie true si le buffer de reception est vide.
   bool IsRXEmpty();

   // Attente d?un événement fixé par SetCommMask()
   bool  WaitCommEvent(DWORD &rEvtMask);

   // fixe la gestion des evenements sur le port serie. Voir doc MSDN :   EV_RXCHAR
   bool  SetCommMask(DWORD EvtMask);

   // recupere l'événement en cours.
   DWORD GetCommMask();

   // Renvoie sous forme litterale la derniere erreur rencontrée avec GetLastError()
   CString GetStringError(){return m_StrError;}

   // Renvoie la derniere valeur du nombre d?octets lus.
   int   GetCountRead(){return m_count;}

   // fixe la fenetre parent pour les messages en provenance de la voie serie.
   void SetParentNotify(HWND *pParent){m_pParent=pParent;}

   // purge le port serie.
   bool PurgeCom();

   // purge la réception
   bool PurgeRx();

   // purge l'émission
   bool PurgeTx();

   // lancer le thread
   bool StartThread(HWND *pParent);

   // redemarre le thread 
   bool ResumeThread();

   // stop le thread.
   bool StopThread();

   // réglage du timeout sur la reception et l'émission
   // Note par défaut le reglage de la voie est a 1s. 
   bool SetTimeouts(DWORD dwRxTimeout=5000,DWORD dwTxTimeout=5000);

   // fonction appelée en cas d'erreur detectée dans le thread.
   // envoie un message à la fenetre parent.
   virtual void OnError(DWORD dwError);

private:
    CCom(const CCom &rCom){ASSERT(0);}
    CCom  & operator = (const CCom & arg){ASSERT(0);return *this;}

protected:

    // thread de communication.
   static UINT Thread(LPVOID pParam);

   // récupération de l?erreur
   DWORD  GetError();

protected:
HWND            *m_pParent;
CString         m_StrError;
DWORD           m_comerr;
HANDLE          m_hCom;
UINT            m_nInputBufferSize;
UINT            m_nOutputBufferSize;
DCB             m_dcb;
DWORD           m_EventMask;
COMMTIMEOUTS    m_ComTimeouts;
OVERLAPPED      m_Ov;
unsigned int    m_count;

long            m_baudrate;
char            m_parity;
int             m_wordlength;
int             m_stopbits;
CWinThread*     m_pThread;
HANDLE          m_hCloseCom;
HANDLE          m_hArrayEvent[2];
bool            m_bThreadExist;
};
#endif

 // !defined(AFX_SERIALCOM)

// cpp

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
17
Date d'inscription
mardi 15 avril 2008
Statut
Membre
Dernière intervention
8 septembre 2010

Meme que sur msdn aussi...
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
ca ressemble exactement à la meme chose qu'on voit ici : http://c.developpez.com/faq/vc/?page=NetWork#WorkWithSerialPort

meme l'adresse email visible dans le source !!
Messages postés
344
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
1
BuildCommDCB et GetOverlappedResult ne servent qu'à gérer les contrôles d'erreurs ?
Ce me surprend.

Mais oui, j'aimerais savoir comment les contourner...
(il ne suffit pas de les commenter car autrement ça pête ailleurs)
Messages postés
6
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
3 juin 2006

Pardon mais je sais pas comment contourner ce problème sauf si vous voulez vous empassez des contrôles d'erreurs pour les deux fonctions.
Messages postés
344
Date d'inscription
jeudi 1 mai 2003
Statut
Membre
Dernière intervention
4 avril 2011
1
Oups, c'était bête.

Par contre, y a t-il moyen de se passer de BuildCommDCB et GetOverlappedResult car je travaille sous Embeddedet ces fonctions ne sont pas implémentées sous Windows CE !

Merci d'avance.
Afficher les 11 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.