www.pudn.com > SmartCardSrc.zip > serialport.h


/* 
Module : SERIALPORT.H 
Purpose: Declaration for an MFC wrapper class for serial ports 
Created: PJN / 31-05-1999 
History: None 
 
Copyright (c) 1999 by PJ Naughter.   
All rights reserved. 
 
*/ 
 
 
 
///////////////////// Macros / Structs etc ////////////////////////// 
 
#ifndef __SERIALPORT_H__ 
#define __SERIALPORT_H__ 
 
 
 
 
 
/////////////////////////// Classes /////////////////////////////////////////// 
 
 
////// Serial port exception class //////////////////////////////////////////// 
 
void AfxThrowSerialException(DWORD dwError = 0); 
 
class CSerialException : public CException 
{ 
public: 
//Constructors / Destructors 
	CSerialException(DWORD dwError); 
	~CSerialException(); 
 
//Methods 
#ifdef _DEBUG 
	virtual void Dump(CDumpContext& dc) const; 
#endif 
	BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,	PUINT pnHelpContext = NULL); 
	CString SerialGetErrorMessage(); 
 
//Data members 
	DWORD m_dwError; 
 
protected: 
	DECLARE_DYNAMIC(CSerialException) 
};	//lint !e1712 default constructor not defined for class 'CSerialException' 
 
 
 
//// The actual serial port class ///////////////////////////////////////////// 
 
class CSerialPort : public CObject 
{ 
public: 
//Enums 
  enum FlowControl 
  { 
    NoFlowControl, 
    CtsRtsFlowControl, 
    CtsDtrFlowControl, 
    DsrRtsFlowControl, 
    DsrDtrFlowControl, 
    XonXoffFlowControl 
  }; 
 
  enum Parity 
  {     
    EvenParity, 
    MarkParity, 
    NoParity, 
    OddParity, 
    SpaceParity 
  }; 
 
  enum StopBits 
  { 
    OneStopBit, 
    OnePointFiveStopBits, 
    TwoStopBits 
  }; 
 
//Constructors / Destructors 
  CSerialPort(); 
  ~CSerialPort(); 
 
//General Methods 
  void Open(int nPort, DWORD dwBaud = 9600, Parity parity = NoParity, BYTE DataBits = 8,  
            StopBits stopbits = OneStopBit, FlowControl fc = NoFlowControl, BOOL bOverlapped = FALSE); 
  void Close(); 
  void Attach(HANDLE hComm); 
  HANDLE Detach(); 
  //operator HANDLE() const { return m_hComm; }; 
  BOOL IsOpen() const { return m_hComm != INVALID_HANDLE_VALUE; }; 
#ifdef _DEBUG 
  void CSerialPort::Dump(CDumpContext& dc) const; 
#endif 
 
//Reading / Writing Methods 
  DWORD Read(void* lpBuf, DWORD dwCount); 
  BOOL Read(void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped); 
  void ReadEx(void* lpBuf, DWORD dwCount); 
  DWORD Write(const void* lpBuf, DWORD dwCount); 
  BOOL Write(const void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped); 
  void WriteEx(const void* lpBuf, DWORD dwCount); 
  void TransmitChar(char cChar); 
  void GetOverlappedResult(OVERLAPPED& overlapped, DWORD& dwBytesTransferred, BOOL bWait); 
  void CancelIo(); 
 
//Configuration Methods 
  void GetConfig(COMMCONFIG& config); 
  static void GetDefaultConfig(int nPort, COMMCONFIG& config); 
  void SetConfig(COMMCONFIG& Config); 
  static void SetDefaultConfig(int nPort, COMMCONFIG& config); 
 
//Misc RS232 Methods 
  void ClearBreak(); 
  void SetBreak(); 
  void ClearError(DWORD& dwErrors); 
  void GetStatus(COMSTAT& stat); 
  void GetState(DCB& dcb); 
  void SetState(DCB& dcb); 
  void Escape(DWORD dwFunc); 
  void ClearDTR(); 
  void ClearRTS(); 
  void SetDTR(); 
  void SetRTS(); 
  void SetXOFF(); 
  void SetXON(); 
  void GetProperties(COMMPROP& properties); 
  void GetModemStatus(DWORD& dwModemStatus);  
 
//Timeouts 
  void SetTimeouts(COMMTIMEOUTS& timeouts); 
  void GetTimeouts(COMMTIMEOUTS& timeouts); 
  void Set0Timeout(); 
  void Set0WriteTimeout(); 
  void Set0ReadTimeout(); 
 
//Event Methods 
  void SetMask(DWORD dwMask); 
  void GetMask(DWORD& dwMask); 
  void WaitEvent(DWORD& dwMask); 
  void WaitEvent(DWORD& dwMask, OVERLAPPED& overlapped); 
   
//Queue Methods 
  void Flush(); 
  void Purge(DWORD dwFlags); 
  void TerminateOutstandingWrites(); 
  void TerminateOutstandingReads(); 
  void ClearWriteBuffer(); 
  void ClearReadBuffer(); 
  void Setup(DWORD dwInQueue, DWORD dwOutQueue); 
 
//Overridables 
  virtual void OnCompletion(DWORD dwErrorCode, DWORD dwCount, LPOVERLAPPED lpOverlapped); 
 
protected: 
  HANDLE m_hComm;       //Handle to the comms port 
  BOOL   m_bOverlapped; //Is the port open in overlapped IO 
 
  static void WINAPI _OnCompletion(DWORD dwErrorCode, DWORD dwCount, LPOVERLAPPED lpOverlapped);  
 
	DECLARE_DYNAMIC(CSerialPort) 
}; 
 
 
#endif //__SERIALPORT_H__