/************************************************************************/
/*  Copyright (C), 2016-2020, [Home], 保留所有权利;
/*  模 块 名：同步串口模块;
/*  描    述：;
/*
/*  版    本：[V];
/*  作    者：[Home];
/*  日    期：[12/20/2017];
/*
/*
/*  注    意：;
/*
/*  修改记录：[Home];
/*  修改日期：;
/*  修改版本：;
/*  修改内容：;
/************************************************************************/

#ifndef __SYN_SERIAL__
#define __SYN_SERIAL__

#pragma once

#define MAX_PORT_LEN 10

class CSynSerial
{
public:
	CSynSerial(void);
	virtual ~CSynSerial(void);

private:
	DCB		m_dcb;
	HANDLE	m_hSerialPort;
	COMMTIMEOUTS	m_cts;

	// 串口号(1~255);
	TCHAR	m_szSerialPort[MAX_PORT_LEN];
	// 输入缓存大小(byte);
	DWORD	m_dwInQueue;
	// 输出缓存大小(byte);
	DWORD	m_dwOutQueue;

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			// 间隔时间;
	);
	// 重装打开串口;
	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);
};

#endif // __SYN_SERIAL__