comm.cpp

来自「手机开发环境BREW实例」· C++ 代码 · 共 320 行

CPP
320
字号
// Comm.cpp: implementation of the CComm class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SMM4COM.h"
#include "Comm.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CComm::CComm()
{
	m_hComDev = INVALID_HANDLE_VALUE;
	m_dwError = 0;
}

CComm::~CComm()
{
	if(IsOpened())Close();
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//	得到当前已打开串口的相关信息。
//参数描述:
//	无
//返回值描述:
//	TRUE:成功
//	FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::PortStateGet()
{
	if(IsOpened())
	{
		m_dcbPort.DCBlength = sizeof(DCB);
		return GetCommState(m_hComDev, &m_dcbPort);
	}
	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//	设置串口相关参数信息。
//参数描述:
//	无
//返回值描述:
//	TRUE:成功
//	FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::PortStateSet()
{
	if(IsOpened())
	{
		return SetCommState(m_hComDev, &m_dcbPort);
	}
	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//	得到当前已打开串口的超时信息。
//参数描述:
//	无
//返回值描述:
//	TRUE:成功
//	FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::PortTimeoutsGet()
{
	if(IsOpened())
	{
		return GetCommTimeouts(m_hComDev, &m_CommTimeOutsPort);
	}
	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//	设置当前已打开串口的超时信息。
//参数描述:
//	无
//返回值描述:
//	TRUE:成功
//	FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::PortTimeoutsSet()
{
	if(IsOpened())
	{
		return SetCommTimeouts(m_hComDev, &m_CommTimeOutsPort);
	}
	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//	设置当前已打开串口的输入、输出缓冲区尺寸。
//参数描述:
//	无
//返回值描述:
//	TRUE:成功
//	FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::PortBufferSizeSet()
{
	if(IsOpened())
	{
		return SetupComm(m_hComDev, m_sBufferSize.dwInput, m_sBufferSize.dwOutput);
	}
	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//	清除错误,查询等待接收的字节数。
//参数描述:
//	无
//返回值描述:
//	等待接收的字节数。
//////////////////////////////////////////////////////////////////////
DWORD CComm::ReadDataWaiting()
{
	if(!IsOpened())return 0;

	DWORD dwErrorFlags;
	COMSTAT ComStat;

	ClearCommError(m_hComDev, &dwErrorFlags, &ComStat);

	return ComStat.cbInQue;
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//打开指定的串口,并设置串口的通用性能。
//参数描述:
//	iPort:输入,串口号。1表示COM1,2表示COM2,以此类推。
//	iBaud:输入,波特率
//	bByteSize:输入,数据位数
//	bParity:输入,奇偶效验位
//	bStopBit:输入,停止位
//	dwfParity:输入,是否允许奇偶效验,1表示允许,0表示不允许
//返回值描述:
//	TRUE:成功
//	FALSE:失败
//备注:
//	如果失败,错误代码可以通过m_dwError得到。
//////////////////////////////////////////////////////////////////////
BOOL CComm::Open(int iPort, int iBaud,BYTE bByteSize,BYTE bParity,BYTE bStopBit,DWORD dwfParity)
{
	if(!IsOpened())
	{
		char szPort[32];
		wsprintf(szPort, "//./COM%d", iPort);
		//以可读写的方式打开指定端口
		m_hComDev = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, 
			NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
		if (m_hComDev == INVALID_HANDLE_VALUE)
			return FALSE;
		if(!(IsOpened() && PortStateGet() && PortTimeoutsGet()))
		{
			m_dwError = GetLastError();
			return FALSE;
		}
	}

//超时时间设置
	m_CommTimeOutsPort.ReadIntervalTimeout = MAXDWORD;
	m_CommTimeOutsPort.ReadTotalTimeoutMultiplier = MAXDWORD;
	m_CommTimeOutsPort.ReadTotalTimeoutConstant = TIME_WAIT_READ_MIN;
	m_CommTimeOutsPort.WriteTotalTimeoutMultiplier = 20;
	m_CommTimeOutsPort.WriteTotalTimeoutConstant = 2000;
//硬件参数设置
	m_dcbPort.BaudRate = iBaud;
	m_dcbPort.ByteSize = bByteSize;
	m_dcbPort.Parity = bParity;
	m_dcbPort.fParity = dwfParity;
	m_dcbPort.StopBits = bStopBit;
//默认性能已调至最优,有修改请注明
	m_dcbPort.fBinary = TRUE;
	m_dcbPort.fOutxCtsFlow = FALSE;
	m_dcbPort.fOutxDsrFlow = FALSE;
	m_dcbPort.fDtrControl = DTR_CONTROL_ENABLE;
	m_dcbPort.fDsrSensitivity = FALSE;
	m_dcbPort.fOutX = FALSE;
	m_dcbPort.fInX = FALSE;
	m_dcbPort.fNull = FALSE;
	m_dcbPort.fRtsControl = RTS_CONTROL_ENABLE;
	m_dcbPort.fAbortOnError = FALSE;
//性能调节结束
	m_sBufferSize.dwInput = DEFAULT_BUFFER_SIZE_INPUT;
	m_sBufferSize.dwOutput = DEFAULT_BUFFER_SIZE_OUTPUT;

	if(PortTimeoutsSet() && PortStateSet() && PortBufferSizeSet())
		return TRUE;

	m_dwError = GetLastError();
	Close();

	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//	无条件关闭当前打开的串口。
//参数描述:
//	无
//返回值描述:
//	无
//////////////////////////////////////////////////////////////////////
void CComm::Close()
{
	CloseHandle(m_hComDev);
	m_hComDev = INVALID_HANDLE_VALUE;
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//	向已打开的串口写入数据。
//参数描述:
//	ucData:输入,写入的数据区指针。
//	iSize:输入,写入的数据字节数。
//返回值描述:
//	TRUE:成功。
//	FALSE:失败.
//备注:
//	如果失败,错误代码可以通过m_dwError得到。
//////////////////////////////////////////////////////////////////////
BOOL CComm::SendData(const unsigned char * pszData, int iSize)
{
	if(!IsOpened())return FALSE;

	ReadDataWaiting();

	DWORD dwBytesWritten = 0;
	BOOL bWriteStatus = WriteFile(m_hComDev, pszData, iSize, &dwBytesWritten, NULL);
	if(bWriteStatus && iSize == (int)dwBytesWritten)
	{
		return TRUE;
	}

	m_dwError = GetLastError();
	return FALSE;
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//	读取接收的数据。
//参数描述:
//	Data:输出,接收的数据区指针。
//	iLimit:输入,接收的数据区长度。
//返回值描述:
//	>=0:成功,返回接收成功的字节数。
//	-1:失败.
//备注:
//	如果失败,错误代码可以通过m_dwError得到。
//////////////////////////////////////////////////////////////////////
int CComm::ReadData(void * pData, int iLimit)
{
	if(!IsOpened())return -1;

	ReadDataWaiting();

	BOOL bReadStatus;
	DWORD dwBytesRead;
	int iCount = 0;
	do
	{
		dwBytesRead = 0;

		bReadStatus = ReadFile(m_hComDev, (char *)pData + iCount, iLimit - iCount, &dwBytesRead, NULL);
		if(!bReadStatus)
		{
			m_dwError = GetLastError();
			return -1;
		}
		iCount += (int)dwBytesRead;

	}while(dwBytesRead);

	return iCount;
}

//////////////////////////////////////////////////////////////////////
//功能描述:
//	设置基本通讯参数。
//参数描述:
//	iBaudRate:输入,波特率。没有无效值保护。
//	iDataBits:输入,数据位数,有效值4-8。
//	bParityMode:输入,校验模式
//	bStopBits:输入,停止数据位数
//	dwfParity:输入,是否进行奇偶效验,1表示效验,0表示不效验
//返回值描述:
//	TRUE:成功
//	FALSE:失败
//////////////////////////////////////////////////////////////////////
BOOL CComm::SetupBase(int iBaudRate, int iDataBits, BYTE bParityMode, BYTE bStopBits,DWORD dwfParity)
{
	if(IsOpened() && (iDataBits > 3 && iDataBits < 9))
	{
		m_dcbPort.BaudRate = iBaudRate;
		m_dcbPort.ByteSize = iDataBits;
		m_dcbPort.Parity = bParityMode;
		m_dcbPort.fParity = dwfParity;
		m_dcbPort.StopBits = bStopBits;

		return PortStateSet();
	}
	return FALSE;
}

⌨️ 快捷键说明

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