|  | @@ -1,6 +1,6 @@
 | 
	
		
			
				|  |  |  /************************************************************************/
 | 
	
		
			
				|  |  |  /*  Copyright (C), 2016-2020, [Home], 保留所有权利;
 | 
	
		
			
				|  |  | -/*  模 块 名:同步串口模块;
 | 
	
		
			
				|  |  | +/*  模 块 名:异步串口模块;
 | 
	
		
			
				|  |  |  /*  描    述:;
 | 
	
		
			
				|  |  |  /*
 | 
	
		
			
				|  |  |  /*  版    本:[V];
 | 
	
	
		
			
				|  | @@ -16,68 +16,460 @@
 | 
	
		
			
				|  |  |  /*  修改内容:;
 | 
	
		
			
				|  |  |  /************************************************************************/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#ifndef __SYN_SERIAL__
 | 
	
		
			
				|  |  | -#define __SYN_SERIAL__
 | 
	
		
			
				|  |  | +#ifndef __BASE_SERIAL__
 | 
	
		
			
				|  |  | +#define __BASE_SERIAL__
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #pragma once
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#define MAX_PORT_LEN 10
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class CSynSerial
 | 
	
		
			
				|  |  | +class CBaseSerial
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  public:
 | 
	
		
			
				|  |  | -	CSynSerial(void);
 | 
	
		
			
				|  |  | -	virtual ~CSynSerial(void);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -private:
 | 
	
		
			
				|  |  | -	DCB		m_dcb;
 | 
	
		
			
				|  |  | -	HANDLE	m_hSerialPort;
 | 
	
		
			
				|  |  | -	COMMTIMEOUTS	m_cts;
 | 
	
		
			
				|  |  | +	//Enums
 | 
	
		
			
				|  |  | +	enum FlowControl
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		NoFlowControl,
 | 
	
		
			
				|  |  | +		CtsRtsFlowControl,
 | 
	
		
			
				|  |  | +		CtsDtrFlowControl,
 | 
	
		
			
				|  |  | +		DsrRtsFlowControl,
 | 
	
		
			
				|  |  | +		DsrDtrFlowControl,
 | 
	
		
			
				|  |  | +		XonXoffFlowControl
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	// 串口号(1~255);
 | 
	
		
			
				|  |  | -	TCHAR	m_szSerialPort[MAX_PORT_LEN];
 | 
	
		
			
				|  |  | -	// 输入缓存大小(byte);
 | 
	
		
			
				|  |  | -	DWORD	m_dwInQueue;
 | 
	
		
			
				|  |  | -	// 输出缓存大小(byte);
 | 
	
		
			
				|  |  | -	DWORD	m_dwOutQueue;
 | 
	
		
			
				|  |  | +	enum Parity
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		NoParity = 0,
 | 
	
		
			
				|  |  | +		OddParity = 1,
 | 
	
		
			
				|  |  | +		EvenParity = 2,
 | 
	
		
			
				|  |  | +		MarkParity = 3,
 | 
	
		
			
				|  |  | +		SpaceParity = 4
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	enum StopBits
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		OneStopBit,
 | 
	
		
			
				|  |  | +		OnePointFiveStopBits,
 | 
	
		
			
				|  |  | +		TwoStopBits
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  | +protected:
 | 
	
		
			
				|  |  | +	HANDLE		m_hComm;
 | 
	
		
			
				|  |  | +	OVERLAPPED	m_ovWait;
 | 
	
		
			
				|  |  | +	OVERLAPPED	m_ovRead;
 | 
	
		
			
				|  |  | +	OVERLAPPED	m_ovWrite;
 | 
	
		
			
				|  |  |  public:
 | 
	
		
			
				|  |  | -	inline BOOL IsOpen() const {
 | 
	
		
			
				|  |  | -		return (m_hSerialPort == NULL || m_hSerialPort == INVALID_HANDLE_VALUE) ? FALSE : TRUE;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 打开串口;
 | 
	
		
			
				|  |  | -	BOOL OpenSerialPort(
 | 
	
		
			
				|  |  | -		IN CONST BYTE& byCommPort,		// 串口号;
 | 
	
		
			
				|  |  | -		IN CONST DWORD& dwBaudRate,		// 波特率;
 | 
	
		
			
				|  |  | -		IN CONST BYTE& bySize,			// 数据位;
 | 
	
		
			
				|  |  | -		IN CONST BYTE& byParity,		// 校验位;
 | 
	
		
			
				|  |  | -		IN CONST BYTE& byStopBits,		// 停止位;
 | 
	
		
			
				|  |  | -		IN CONST BYTE& byStartAddr,		// 起始地址;
 | 
	
		
			
				|  |  | -		IN CONST INT& nInterval			// 间隔时间;
 | 
	
		
			
				|  |  | +	CBaseSerial(void);
 | 
	
		
			
				|  |  | +	virtual ~CBaseSerial(void);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL IsOpen() const throw() // noexcept 
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return m_hComm != INVALID_HANDLE_VALUE;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	void Close() throw()  // noexcept  
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		if (IsOpen())
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			CloseHandle(m_hComm);
 | 
	
		
			
				|  |  | +			m_hComm = INVALID_HANDLE_VALUE;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL Open(LPCTSTR pszPort, BOOL bOverlapped = FALSE) throw(); // noexcept 
 | 
	
		
			
				|  |  | +	BOOL Open(
 | 
	
		
			
				|  |  | +		int nPort, 
 | 
	
		
			
				|  |  | +		DWORD dwBaud = 9600, 
 | 
	
		
			
				|  |  | +		BYTE DataBits = 8, 
 | 
	
		
			
				|  |  | +		int parity = NoParity, 
 | 
	
		
			
				|  |  | +		int stopBits = OneStopBit,
 | 
	
		
			
				|  |  | +		int fc = NoFlowControl, 
 | 
	
		
			
				|  |  | +		BOOL bOverlapped = FALSE
 | 
	
		
			
				|  |  |  	);
 | 
	
		
			
				|  |  | -	// 重装打开串口;
 | 
	
		
			
				|  |  | -	BOOL ReOpenSerialPort();
 | 
	
		
			
				|  |  | -	// 关闭串口;
 | 
	
		
			
				|  |  | -	void CloseSerialPort();
 | 
	
		
			
				|  |  | -	// 设置串口参数;
 | 
	
		
			
				|  |  | -	BOOL SetSerialPort(
 | 
	
		
			
				|  |  | -		IN CONST DWORD& dwBaudRate,		// 波特率;
 | 
	
		
			
				|  |  | -		IN CONST BYTE& byByteSize,		// 数据位;
 | 
	
		
			
				|  |  | -		IN CONST BYTE& byParity,		// 校验位;
 | 
	
		
			
				|  |  | -		IN CONST BYTE& byStopBits,		// 停止位;
 | 
	
		
			
				|  |  | -		IN CONST BYTE& byStartAddr,		// 起始地址;
 | 
	
		
			
				|  |  | -		IN CONST DWORD& dwInQueue,		// 输入缓存;
 | 
	
		
			
				|  |  | -		IN CONST DWORD& dwOutQueue		// 输出缓存;
 | 
	
		
			
				|  |  | -		);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	// 设置dcb参数;
 | 
	
		
			
				|  |  | -	void SetSerialDCB(IN CONST DCB &dcb);
 | 
	
		
			
				|  |  | -	// 设置commtimeouts参数;
 | 
	
		
			
				|  |  | -	void SetSerialCommTimeouts(IN CONST COMMTIMEOUTS &commTimeouts);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	virtual DWORD WriteComm(IN BYTE *pWirteBuf, IN CONST INT32 nWriteSize);
 | 
	
		
			
				|  |  | -	virtual DWORD ReadComm(IN BYTE *pReadBuf, IN CONST DWORD& dwReadSize, WORD timeout = 300);
 | 
	
		
			
				|  |  | +	BOOL Open(
 | 
	
		
			
				|  |  | +		LPCTSTR pszPort, 
 | 
	
		
			
				|  |  | +		DWORD dwBaud = 9600, 
 | 
	
		
			
				|  |  | +		BYTE DataBits = 8, 		
 | 
	
		
			
				|  |  | +		int parity = NoParity, 
 | 
	
		
			
				|  |  | +		int stopBits = OneStopBit,
 | 
	
		
			
				|  |  | +		int fc = NoFlowControl, 
 | 
	
		
			
				|  |  | +		BOOL bOverlapped = FALSE
 | 
	
		
			
				|  |  | +	) throw(); // noexcept 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	//////////////////////////////////////////////////////////////////////////
 | 
	
		
			
				|  |  | +	//Reading / Writing Methods
 | 
	
		
			
				|  |  | +	BOOL Read(void* lpBuffer, DWORD dwNumberOfBytesToRead, DWORD& dwBytesRead) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return ReadFile(m_hComm, lpBuffer, dwNumberOfBytesToRead, &dwBytesRead, NULL);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL Read(void* lpBuffer, DWORD dwNumberOfBytesToRead, OVERLAPPED& overlapped, DWORD* lpNumberOfBytesRead = NULL) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return ReadFile(m_hComm, lpBuffer, dwNumberOfBytesToRead, lpNumberOfBytesRead, &overlapped);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL ReadEx(LPVOID lpBuffer, DWORD dwNumberOfBytesToRead, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return ReadFileEx(m_hComm, lpBuffer, dwNumberOfBytesToRead, lpOverlapped, lpCompletionRoutine);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// 必须先启用:SetMask(EV_ERR | EV_RXCHAR),才能使用WaitCommEvent;
 | 
	
		
			
				|  |  | +	BOOL ReadAsyn(void* lpBuffer, DWORD dwNumberOfBytesToRead, DWORD& dwNumberOfBytesRead) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		COMSTAT cs = { 0 };
 | 
	
		
			
				|  |  | +		DWORD dwErrors = 0;
 | 
	
		
			
				|  |  | +		DWORD dwEvtMask = 0;
 | 
	
		
			
				|  |  | +		DWORD dwNumberOfBytesTransferred;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		m_ovWait.Offset = 0;
 | 
	
		
			
				|  |  | +		m_ovRead.Offset = 0;
 | 
	
		
			
				|  |  | +		BOOL Status = WaitCommEvent(m_hComm, &dwEvtMask, &m_ovWait);
 | 
	
		
			
				|  |  | +		// WaitCommEvent也是一个异步命令,所以需要等待
 | 
	
		
			
				|  |  | +		if (!Status && GetLastError() == ERROR_IO_PENDING)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			// 如果缓存中无数据线程会停在此,如果hCom关闭会立即返回False
 | 
	
		
			
				|  |  | +			Status = ::GetOverlappedResult(m_hComm, &m_ovWait, &dwNumberOfBytesTransferred, TRUE);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		ClearCommError(m_hComm, &dwErrors, &cs);
 | 
	
		
			
				|  |  | +		if (Status && dwEvtMask & EV_RXCHAR && cs.cbInQue > 0) //有数据
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			dwNumberOfBytesTransferred = 0;
 | 
	
		
			
				|  |  | +			memset(lpBuffer, 0, dwNumberOfBytesToRead);
 | 
	
		
			
				|  |  | +			// 数据已经到达缓存区,ReadFile不会当成异步命令,而是立即读取并返回True
 | 
	
		
			
				|  |  | +			Status = ReadFile(m_hComm, lpBuffer, dwNumberOfBytesToRead, &dwNumberOfBytesRead, &m_ovRead);
 | 
	
		
			
				|  |  | +			PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_RXABORT);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return Status;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL Write(const void* lpBuffer, DWORD dwNumberOfBytesToWrite, DWORD& dwBytesWritten) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		dwBytesWritten = 0;
 | 
	
		
			
				|  |  | +		return WriteFile(m_hComm, lpBuffer, dwNumberOfBytesToWrite, &dwBytesWritten, NULL);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL Write(const void* lpBuffer, DWORD dwNumberOfBytesToWrite, OVERLAPPED& overlapped, DWORD* lpNumberOfBytesWritten = NULL) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return WriteFile(m_hComm, lpBuffer, dwNumberOfBytesToWrite, lpNumberOfBytesWritten, &overlapped);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// SetMask(EV_ERR | EV_RXCHAR);
 | 
	
		
			
				|  |  | +	BOOL WriteAsyn(const void* lpBuffer, DWORD dwNumberOfBytesToWrite, DWORD& dwNumberOfBytesWritten) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_TXABORT);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		m_ovWait.Offset = 0;
 | 
	
		
			
				|  |  | +		BOOL bRet = WriteFile(m_hComm, lpBuffer, dwNumberOfBytesToWrite, &dwNumberOfBytesWritten, &m_ovWrite);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if (!bRet && GetLastError() == ERROR_IO_PENDING)//后台读取
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			//等待数据写入完成
 | 
	
		
			
				|  |  | +			if (FALSE == ::GetOverlappedResult(m_hComm, &m_ovWrite, &dwNumberOfBytesWritten, TRUE))
 | 
	
		
			
				|  |  | +			{
 | 
	
		
			
				|  |  | +				return FALSE;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return bRet;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL WriteEx(LPCVOID lpBuffer, DWORD dwNumberOfBytesToWrite, LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return WriteFileEx(m_hComm, lpBuffer, dwNumberOfBytesToWrite, lpOverlapped, lpCompletionRoutine);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL TransmitChar(char cChar) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return TransmitCommChar(m_hComm, cChar);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL GetOverlappedResult(OVERLAPPED& overlapped, DWORD& dwBytesTransferred, BOOL bWait) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return ::GetOverlappedResult(m_hComm, &overlapped, &dwBytesTransferred, bWait);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	__if_exists(::GetOverlappedResultEx)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		BOOL GetOverlappedResultEx(OVERLAPPED & overlapped, DWORD & dwBytesTransferred, DWORD dwMilliseconds, _In_ BOOL bAlertable) throw()
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +			return ::GetOverlappedResultEx(m_hComm, &overlapped, &dwBytesTransferred, dwMilliseconds, bAlertable);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL CancelIo() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return ::CancelIo(m_hComm);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	__if_exists(::CancelIoEx)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		BOOL CancelIoEx(LPOVERLAPPED lpOverlapped = NULL) throw()
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			return ::CancelIoEx(m_hComm, lpOverlapped);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL BytesWaiting(DWORD& dwBytesWaiting) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		//Check to see how many characters are unread
 | 
	
		
			
				|  |  | +		dwBytesWaiting = 0;
 | 
	
		
			
				|  |  | +		COMSTAT stat;
 | 
	
		
			
				|  |  | +		if (!GetStatus(stat))
 | 
	
		
			
				|  |  | +			return FALSE;
 | 
	
		
			
				|  |  | +		dwBytesWaiting = stat.cbInQue;
 | 
	
		
			
				|  |  | +		return TRUE;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	//Configuration Methods
 | 
	
		
			
				|  |  | +	BOOL GetConfig(COMMCONFIG& config) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		DWORD dwSize = sizeof(COMMCONFIG);
 | 
	
		
			
				|  |  | +		return GetCommConfig(m_hComm, &config, &dwSize);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	static BOOL GetDefaultConfig(int nPort, COMMCONFIG& config)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		CString sPort;
 | 
	
		
			
				|  |  | +		sPort.Format(_T("COM%d"), nPort);
 | 
	
		
			
				|  |  | +		//Delegate to the other version of the method
 | 
	
		
			
				|  |  | +		return GetDefaultConfig(sPort, config);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	static BOOL GetDefaultConfig(LPCTSTR pszPort, COMMCONFIG& config) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		DWORD dwSize = sizeof(COMMCONFIG);
 | 
	
		
			
				|  |  | +		return GetDefaultCommConfig(pszPort, &config, &dwSize);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL SetConfig(COMMCONFIG& config) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		const DWORD dwSize = sizeof(COMMCONFIG);
 | 
	
		
			
				|  |  | +		return SetCommConfig(m_hComm, &config, dwSize);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	static BOOL SetDefaultConfig(int nPort, COMMCONFIG& config)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		CString sPort;
 | 
	
		
			
				|  |  | +		sPort.Format(_T("COM%d"), nPort);
 | 
	
		
			
				|  |  | +		//Delegate to the other version of the method
 | 
	
		
			
				|  |  | +		return SetDefaultConfig(sPort, config);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	static BOOL SetDefaultConfig(LPCTSTR pszPort, COMMCONFIG& config) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		const DWORD dwSize = sizeof(COMMCONFIG);
 | 
	
		
			
				|  |  | +		return SetDefaultCommConfig(pszPort, &config, dwSize);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	//Misc RS232 Methods
 | 
	
		
			
				|  |  | +	BOOL ClearBreak() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return ClearCommBreak(m_hComm);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL SetBreak() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return SetCommBreak(m_hComm);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL ClearError(DWORD& dwErrors) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return ClearCommError(m_hComm, &dwErrors, NULL);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL GetStatus(COMSTAT& stat) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		DWORD dwErrors = 0;
 | 
	
		
			
				|  |  | +		return ClearCommError(m_hComm, &dwErrors, &stat);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL GetState(DCB& dcb) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return GetCommState(m_hComm, &dcb);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL SetState(DCB& dcb) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return SetCommState(m_hComm, &dcb);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL Escape(DWORD dwFunc) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return EscapeCommFunction(m_hComm, dwFunc);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL ClearDTR() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return Escape(CLRDTR);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL ClearRTS() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return Escape(CLRRTS);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL SetDTR() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return Escape(SETDTR);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL SetRTS() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return Escape(SETRTS);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL SetXOFF() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return Escape(SETXOFF);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL SetXON() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return Escape(SETXON);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL GetProperties(COMMPROP& properties) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return GetCommProperties(m_hComm, &properties);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL GetModemStatus(DWORD& dwModemStatus) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return GetCommModemStatus(m_hComm, &dwModemStatus);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	//Timeouts
 | 
	
		
			
				|  |  | +	BOOL SetTimeouts(COMMTIMEOUTS& timeouts) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return SetCommTimeouts(m_hComm, &timeouts);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL GetTimeouts(COMMTIMEOUTS& timeouts) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return GetCommTimeouts(m_hComm, &timeouts);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL Set0Timeout() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		COMMTIMEOUTS Timeouts;
 | 
	
		
			
				|  |  | +		memset(&Timeouts, 0, sizeof(Timeouts));
 | 
	
		
			
				|  |  | +		Timeouts.ReadIntervalTimeout = MAXDWORD;
 | 
	
		
			
				|  |  | +		return SetTimeouts(Timeouts);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL Set0WriteTimeout() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		COMMTIMEOUTS Timeouts;
 | 
	
		
			
				|  |  | +		GetTimeouts(Timeouts);
 | 
	
		
			
				|  |  | +		Timeouts.WriteTotalTimeoutMultiplier = 0;
 | 
	
		
			
				|  |  | +		Timeouts.WriteTotalTimeoutConstant = 0;
 | 
	
		
			
				|  |  | +		return SetTimeouts(Timeouts);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL Set0ReadTimeout() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		COMMTIMEOUTS Timeouts;
 | 
	
		
			
				|  |  | +		GetTimeouts(Timeouts);
 | 
	
		
			
				|  |  | +		Timeouts.ReadIntervalTimeout = MAXDWORD;
 | 
	
		
			
				|  |  | +		Timeouts.ReadTotalTimeoutMultiplier = 0;
 | 
	
		
			
				|  |  | +		Timeouts.ReadTotalTimeoutConstant = 0;
 | 
	
		
			
				|  |  | +		return SetTimeouts(Timeouts);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	//Event Methods
 | 
	
		
			
				|  |  | +	BOOL SetMask(DWORD dwMask) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return SetCommMask(m_hComm, dwMask);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL GetMask(DWORD& dwMask) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return GetCommMask(m_hComm, &dwMask);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL WaitEvent(DWORD& dwMask) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return WaitCommEvent(m_hComm, &dwMask, NULL);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL WaitEvent(DWORD& dwMask, OVERLAPPED& overlapped) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		ATLASSERT(overlapped.hEvent != NULL);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		return WaitCommEvent(m_hComm, &dwMask, &overlapped);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	//Queue Methods
 | 
	
		
			
				|  |  | +	BOOL Flush() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return FlushFileBuffers(m_hComm);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL Purge(DWORD dwFlags) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return PurgeComm(m_hComm, dwFlags);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL TerminateOutstandingWrites() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return Purge(PURGE_TXABORT);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL TerminateOutstandingReads() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return Purge(PURGE_RXABORT);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL ClearWriteBuffer() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return Purge(PURGE_TXCLEAR);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL ClearReadBuffer() throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		return Purge(PURGE_RXCLEAR);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOL Setup(DWORD dwInQueue, DWORD dwOutQueue) throw()
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		ATLASSERT(IsOpen());
 | 
	
		
			
				|  |  | +		return SetupComm(m_hComm, dwInQueue, dwOutQueue);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#endif // __SYN_SERIAL__
 | 
	
		
			
				|  |  | +#endif // __ASYN_SERIAL__
 |