⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serialport.h

📁 一个封装好的串口通信类
💻 H
字号:
/*
Module : SERIALPORT.H
Purpose: Declaration for an MFC wrapper class for serial ports
Created: PJN / 31-05-1999

  Copyright (c) 1999 - 2002 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);

typedef void (* pOnReceiveData)(void*,DWORD);

class CSerialException : public CException
{
public:
	//Constructors / Destructors
	CSerialException(DWORD dwError);
	~CSerialException();
	
	//Methods
#ifdef _DEBUG
	virtual void Dump(CDumpContext& dc) const;
#endif
	virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,	PUINT pnHelpContext = NULL);
	CString GetErrorMessage();
	
	//Data members
	DWORD m_dwError;
	
protected:
	DECLARE_DYNAMIC(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();
	virtual ~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, BOOL bOverlapped = FALSE);
	HANDLE Detach();
	operator HANDLE() const { return m_hComm; };
	BOOL IsOpen() const { return m_hComm != INVALID_HANDLE_VALUE; };
#ifdef _DEBUG
	void Dump(CDumpContext& dc) const;
#endif
	
	//Reading / Writing Methods
	DWORD Read(void* lpBuf, DWORD dwCount);
	BOOL  Read(void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped, DWORD* pBytesRead=NULL);
	void  ReadEx(void* lpBuf, DWORD dwCount);
	DWORD Write(const void* lpBuf, DWORD dwCount);
	BOOL  Write(const void* lpBuf, DWORD dwCount, OVERLAPPED& overlapped, DWORD* pBytesWritten=NULL);
	void  WriteEx(const void* lpBuf, DWORD dwCount);
	void  TransmitChar(char cChar);
	bool  GetOverlappedResult(OVERLAPPED& overlapped, DWORD& dwBytesTransferred, BOOL bWait);
	void  CancelIo();
	DWORD BytesWaiting();
	BOOL  DataWaiting(DWORD dwTimeout);
	//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);
	bool WaitEvent(DWORD& dwMask);
	BOOL 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);
	//
	int GetComPortNum() { return m_CurPortNum; }
protected:
	HANDLE m_hComm;       //Handle to the comms port
	BOOL   m_bOverlapped; //Is the port open in overlapped IO
	HANDLE m_hEvent;      //A event handle we need for internal synchronisation
	
	int m_CurPortNum;    //当前串口号 
	static void WINAPI _OnCompletion(DWORD dwErrorCode, DWORD dwCount, LPOVERLAPPED lpOverlapped); 
	
	DECLARE_DYNAMIC(CSerialPort)
public:
	pOnReceiveData OnReceiveData;
};


#endif //__SERIALPORT_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -