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

📄 serialport.h

📁 GSM通讯串口类,通过RS232串口与GSM MODEM连接,发送短信.
💻 H
字号:
// SerialPort.h: interface for the CSerialPort class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SERIALPORT_H__9E263F73_9037_4DFD_A391_5176DC806079__INCLUDED_)
#define AFX_SERIALPORT_H__9E263F73_9037_4DFD_A391_5176DC806079__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CSerialException : public CException
{
public:
//Constructors / Destructors
	CSerialException(DWORD dwError);
	~CSerialException();

	static void ThrowSerialException(DWORD dwError = 0);

//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)
};

typedef struct tagCOMMDATA {
	LPVOID	pParam;
	DWORD	dwParamCount;
} COMMDATA;

class CSerialPort : public CObject  
{
public:
//构造/析构函数
	CSerialPort();
	virtual ~CSerialPort();

public:
//串口操作的基本方法
	void InitPort(CWnd* pPortOwner, UINT nPortNr = 1, UINT baud = 9600, char parity = 'N', UINT databits = 8,
		UINT stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR | EV_TXEMPTY, UINT nBufferSize = 1024);
	void ClosePort(void) { ASSERT(m_hShutdownEvent); ::SetEvent(m_hShutdownEvent); }
	
	operator HANDLE() const { return m_hComm; }
	BOOL IsOpen(void) const { return m_hComm != INVALID_HANDLE_VALUE; }

#ifdef _DEBUG
	void Dump(CDumpContext& dc) const;
#endif

public:
//串口配置及其他方法
	void SetState(DCB& dcb);
	void GetState(DCB& dcb);
	void BuildDCB(const CString& strDef, DCB& dcb);
	void BuildDCBAndTimeouts(const CString& strDef, DCB& dcb, COMMTIMEOUTS commtimeouts);
	void ClearError(DWORD& dwErrors);
	void GetStatus(COMSTAT& comstat);
	void Escape(const DWORD& dwFunc);
	void ClearDTR(void);
	void ClearRTS(void);
	void SetDTR(void);
	void SetRTS(void);
	void SetXOFF(void);
	void SetXON(void);
	void GetModemStatus(DWORD& dwModemStatus);
	void GetProperties(COMMPROP& commprop);
	void ClearBreak(void);
	void SetBreak(void);

public:
//时间方法
	void GetTimeouts(COMMTIMEOUTS& commtimeouts);
	void SetTimeouts(COMMTIMEOUTS& commtimeouts);
	void SetWaitTimeouts(const DWORD& dwMilliseconds = INFINITE) { m_dwTimeoutMilliseconds = dwMilliseconds; }
	void Set0Timeout(void);
	void Set0WriteTimeout(void);
	void Set0ReadTimeout(void);

public:
//串口事件方法
	void GetMask(DWORD& dwEvtMask);
	void SetMask(const DWORD& dwEvtMask);
	BOOL WaitEvent(DWORD& dwEvtMask, OVERLAPPED& overlapped);

public:
//队列方法
	void Purge(const DWORD& dwFlags);
	void Flush(void);
	void Setup(const DWORD& dwInQueue, const DWORD& dwOutQueue);
	void TerminateOutstandingWrites(void);
	void TerminateOutstandingReads(void);
	void ClearWriteBuffer(void);
	void ClearReadBuffer(void);

public:
//配置方法
	void GetConfig(COMMCONFIG& config);
	static void GetDefaultConfig(UINT nPortNr, COMMCONFIG& config);
	void SetConfig(COMMCONFIG& Config);
	static void SetDefaultConfig(UINT nPortNr, COMMCONFIG& config);

public:
//线程操作方法
	BOOL StartMonitoring(void);
	BOOL StopMonitoring(void);
	BOOL RestartMonitoring(void);

public:
//串口读写方法
	BOOL Read(LPVOID lpBuffer, const DWORD& dwNumberOfBytesToRead, OVERLAPPED& overlapped, LPDWORD lpNumberOfBytesRead);
	BOOL Write(LPCVOID lpBuffer, const DWORD& dwNumberOfBytesToWrite, OVERLAPPED& overlapped, LPDWORD lpNumberOfBytesWrite);
	void GetOverlappedResult(OVERLAPPED& overlapped,DWORD& dwBytesTransfered, BOOL bWait);
	void TransmitChar(const char& cChar);

public:
//自定义消息
	static const UINT WM_COMM_BREAK_DETECTED;
	static const UINT WM_COMM_CTS_DETECTED;
	static const UINT WM_COMM_DSR_DETECTED;
	static const UINT WM_COMM_ERR_DETECTED;
	static const UINT WM_COMM_RING_DETECTED;
	static const UINT WM_COMM_RLSD_DETECTED;
	static const UINT WM_COMM_RXFLAG_DETECTED;
	static const UINT WM_COMM_TXEMPTY_DETECTED;
	static const UINT WM_COMM_READED_DETECTED;
	static const UINT WM_COMM_TIMEOUT_DETECTED;

public:
//设置事件对象方法
	void SetWriteEvent(void) { ASSERT(m_hWriteEvent); ::SetEvent(m_hWriteEvent); }
private:
	BOOL SetReadEvent(void);
	BOOL SetBreakEvent(DWORD& dwCommEvents);

protected:
//各种串口事件处理方法
	BOOL HandleBreakEvent(DWORD& dwCommEvent);
	void HandleShutdownEvent(void) { m_bThreadAlive = FALSE; }
	void HandleWaitTimeouts(void);
//子类必须重载这两个方法,完成读写事件方法
//注意:HandleReadedEvent通过WM_COMM_TIMEOUT_DETECTED自定义消息传递COMMDATA自定义结构
//		如有必要可以扩充此结构,以满足用户需求
	virtual BOOL HandleReadedEvent(LPVOID pParam = NULL, const DWORD& dwReadCount = 0) = 0;
	virtual BOOL HandleWriteEvent(void) = 0;
	
private:
//串口句柄
	HANDLE	m_hComm;
//串口号
	UINT	m_nPortNr;
//串口监视的事件
	DWORD	m_dwCommEvents;
//串口设置结构
	DCB				m_dcb;
	COMMTIMEOUTS	m_CommTimeouts;
//超时
	DWORD	m_dwTimeoutMilliseconds;

//类的拥有者窗口
	CWnd* m_pOwner;

//临界区变量	
	CRITICAL_SECTION m_csCommunicationSync;

private:
//重叠结构
	OVERLAPPED m_ReadOverlapped;
	OVERLAPPED m_BreakOverlapped;
protected:
	OVERLAPPED m_WriteOverlapped;

private:
//事件及事件数组
	HANDLE m_hShutdownEvent;
	HANDLE m_hWriteEvent;	
	HANDLE m_hEventArray[4];

//线程对象
	CWinThread* m_Thread;
//线程存活标志
	BOOL		m_bThreadAlive;
//线程函数
	static UINT CommThread(LPVOID pParam);

//输入缓冲区
	BYTE*	m_lpInputBuffer;
	UINT	m_nBufferSize;

	DECLARE_DYNAMIC(CSerialPort)
};

#endif // !defined(AFX_SERIALPORT_H__9E263F73_9037_4DFD_A391_5176DC806079__INCLUDED_)

⌨️ 快捷键说明

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