📄 comport.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 + -