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

📄 comport.h

📁 支持同步异步模式的串口类,当串口有数据过来时自动接受,可被继承扩展
💻 H
字号:
/************************************************************************
   Author:		Qinqing
   Date:		2009-1-7
   Description: C++串口类,支持同步和异步模式
************************************************************************/

#ifndef _COMPORT_H
#define _COMPORT_H

#include "CriticalSectionEx.h"
#include <string>
#include <memory>
using namespace std;


class  CComPort
{
public:
	enum FlowControl
	{
		NoFlowControl,
		CtsRtsFlowControl,
		CtsDtrFlowControl,
		DsrRtsFlowControl,
		DsrDtrFlowControl,
		XonXoffFlowControl
	};

	enum Parity
	{   
		NoParity,
		OddParity,
		EvenParity,
		MarkParity,
		SpaceParity
	};

	enum StopBits
	{
		OneStopBit,
		OnePointFiveStopBits,
		TwoStopBits
	};

	static const DWORD DEFAULT_EVENT_MASK = EV_RXCHAR | EV_ERR | EV_CTS | EV_DSR | EV_BREAK | EV_TXEMPTY | EV_RING | EV_RLSD;

public:
	CComPort();
	virtual ~CComPort();

public:
	BOOL  Open(int nPort, BOOL bOverlapped = FALSE, DWORD dwBaud = 9600, BYTE DataBits = 8,
		       Parity parity = NoParity, StopBits stopbits = OneStopBit, FlowControl fc = NoFlowControl
			 );
	void  Close();
    BOOL  IsOpen() const;
    void  SetBufferSize(DWORD dwInputSize, DWORD dwOutputSize);
    DWORD GetInputSize() const;

    void  SetEvent(DWORD dwMask);
	BOOL  WaitEvent(DWORD &dwMask);

	void SetTimeouts(COMMTIMEOUTS& timeouts);
	void GetTimeouts(COMMTIMEOUTS& timeouts);

	DWORD ReadComm(void* pData, DWORD dwDataSize, DWORD dwTimeouts = 0);
	DWORD WriteComm(const void* pData, DWORD dwDataSize);

protected:
	virtual void  OnReceive(PVOID pBuffer, DWORD dwDataSize);

private:
    CComPort(const CComPort& Right);
	CComPort& operator= (const CComPort& Right);

private:
	HANDLE		m_hComm;           //串口句柄
    OVERLAPPED	m_ReadOverlapped;  //读重叠事件
	OVERLAPPED	m_WriteOverlapped; //写重叠事件
	OVERLAPPED	m_WaitOverlapped;  //等待重叠事件
	BOOL		m_bOverlapped;     //通信模式,TRUE表示异步,FALSE表示同步

private:
	class	CReadComThread;
	friend class CReadComThread;
	CReadComThread*  m_pReadComThread;
};

/**************************************************************************************
嵌套读取线程类
***************************************************************************************/
class CComPort::CReadComThread
{
public:
	CReadComThread(CComPort* pComPort);
	virtual ~CReadComThread();
	
public:
	BOOL Create(DWORD dwCreateFlags = 0,UINT nStackSize = 0,LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
	void Resume();
	void Suspend();
	void Exit();
	
public:
	operator HANDLE() const
	{
		return m_hThread;
	}

protected:
	static DWORD WINAPI ThreadProc(LPVOID lpParam);

private:
	CReadComThread(const CReadComThread& Right);
	CReadComThread& operator=(const CReadComThread& Right);

private:
	CComPort*  m_pComPort;
	HANDLE     m_hThread;
	BOOL       m_bExit;              //使线程退出标志,TRUE表示退出状态,FALSE表示运行状态    
	char       m_InputBuf[2048];
	
};

/************************************************************************
				单例模式实现宏                                          
/************************************************************************/
//在头文件类声明中加入下列宏
#define  SINGLETON_DECLARE(ClassName) \
	public:\
	  static ClassName* GetInstance()\
	{\
			if (s_Instance.get() == 0)\
			{\
				s_Instance.reset(new ClassName());\
			}\
			return s_Instance.get();\
	}\
	private:\
	  ClassName(const ClassName& ); \
	  ClassName& operator=(const ClassName&);\
    private:\
	    friend auto_ptr<ClassName>;\
		static auto_ptr<ClassName> s_Instance; 

 //在实现文件中加入下列宏
#define  SINGLETON_IMPLEMENT(ClassName) \
	     auto_ptr<ClassName> ClassName::s_Instance;

		
/************************************************************************
                 同步锁实现宏
************************************************************************/
#define  THREAD_SYNC(ClassName)\
public:\
    struct InnerLock\
    {\
	    ClassName* ptr;\
		InnerLock(ClassName* p) : ptr(p)\
        {\
		   ptr->Lock();\
        }\
		~InnerLock()\
        {\
		   ptr->UnLock();\
        }\
    };\
public:\
	void Lock()\
	{\
	   m_cs.Lock();\
    }\
	void UnLock()\
    {\
	   m_cs.UnLock();\
    }\
private:\
	CCriticalSectionEx  m_cs;


#endif 

⌨️ 快捷键说明

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