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

📄 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
//	共 2 个常用函数:
//		AfxThrowSerialException()
//		e->GetErrorMessage()
//---------------------------------------------------------------------------------------

extern void AfxThrowSerialException(DWORD dwError = 0);
typedef void (* PFNON_RECEIVE_DATA) (void*, DWORD);

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

	CString GetErrorMessage();

protected:
// Methods
#ifdef _DEBUG
	virtual void Dump(CDumpContext& dc) const;
#endif
	virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,	PUINT pnHelpContext = NULL);

// Data members
	DWORD m_dwError;
protected:
	DECLARE_DYNAMIC(CSerialException)
};


//---------------------------------------------------------------------------------------
//	The actual serial port class
//---------------------------------------------------------------------------------------

// Enums
enum FlowControl
{
	NoFlowControl,
	CtsRtsFlowControl,
	CtsDtrFlowControl,
	DsrRtsFlowControl,
	DsrDtrFlowControl,
	XonXoffFlowControl
};

enum Parity
{	//	奇偶校验位
	EvenParity,
	MarkParity,
	NoParity,
	OddParity,
	SpaceParity
};

enum StopBits
{	//	停止位
	OneStopBit,
	OnePointFiveStopBits,
	TwoStopBits
};

class CSerialPort : public CObject
{
public:
	//	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; }
	HANDLE GetHandle() { return m_hComm; }

	//	属性
	BOOL IsOpen() const { return m_hComm != INVALID_HANDLE_VALUE; }
	int GetComPortNum() { return m_CurPortNum; }

#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);

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:
	PFNON_RECEIVE_DATA OnReceiveData;
};



#endif //__SERIALPORT_H__

⌨️ 快捷键说明

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