Comm.h头文件:
#ifndef __CCOMM_H__
#define __CCOMM_H__
class CComm // 串口操作封装类
{
private :
HANDLE m_hComm;
public :
CComm(); // 构造函数
~ CComm(); // 析构函数
BOOL OpenComm( int nComm); // 打开串口函数
void CloseComm(); // 关闭串口函数
BOOL SetComm( int nBaudRate /* 波特率 */ , int nParity /* 奇偶校验位 */ , int nByteSize /* 字节位数 */ , int nStopBits /* 停止位 */ ); // 设置串口函数
BOOL SetTimeOuts(); // 设置超时函数
BOOL ReadComm( char * lpBuf, int nLen); // 读串口函数
BOOL WriteComm( char * lpBuf, int nLen); // 写串口函数
};
#endif
#define __CCOMM_H__
class CComm // 串口操作封装类
{
private :
HANDLE m_hComm;
public :
CComm(); // 构造函数
~ CComm(); // 析构函数
BOOL OpenComm( int nComm); // 打开串口函数
void CloseComm(); // 关闭串口函数
BOOL SetComm( int nBaudRate /* 波特率 */ , int nParity /* 奇偶校验位 */ , int nByteSize /* 字节位数 */ , int nStopBits /* 停止位 */ ); // 设置串口函数
BOOL SetTimeOuts(); // 设置超时函数
BOOL ReadComm( char * lpBuf, int nLen); // 读串口函数
BOOL WriteComm( char * lpBuf, int nLen); // 写串口函数
};
#endif
Comm.cpp实现文件:
#include
"
StdAfx.h
"
#include " Comm.h "
// 构造函数
CComm::CComm()
{
}
// 析构函数
CComm:: ~ CComm()
{
CloseComm(); // 关闭串口
}
// 打开串口函数
BOOL CComm::OpenComm( int nComm)
{
CString strCommName;
CString strErrInfo;
strCommName.Format( " COM%d " ,nComm);
m_hComm = ::CreateFile(strCommName, /* 要打开串口名称 */
GENERIC_READ | GENERIC_WRITE, /* 允许读和写 */
0 , /* 独占方式 */
NULL, /* 安全属性 */
OPEN_EXISTING, /* 打开而不是创建 */
0 , /* 同步方式 */
NULL); /* 模板句柄 */
if (m_hComm == INVALID_HANDLE_VALUE)
{
strErrInfo.Format( " 打开%s失败! " ,strCommName);
AfxMessageBox(strErrInfo);
return FALSE;
}
else
{
return TRUE;
}
}
// 关闭串口函数
void CComm::CloseComm()
{
if (m_hComm != INVALID_HANDLE_VALUE)
{
::CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
}
}
// 设置串口函数
BOOL CComm::SetComm( int nBaudRate /* 波特率 */ , int nParity /* 奇偶校验位 */ , int nByteSize /* 字节位数 */ , int nStopBits /* 停止位 */ )
{
DCB stDCB;
memset( & stDCB, 0 , sizeof (stDCB));
if ( ! ::GetCommState(m_hComm, & stDCB)) // 获取串口当前状态属性
return FALSE;
stDCB.BaudRate = nBaudRate; // 波特率
stDCB.fParity = 0 ;
stDCB.Parity = nParity; // 奇偶校验位(NOPARITY等)
stDCB.ByteSize = nByteSize; // 每个字节有8位
stDCB.StopBits = nStopBits; // 停止位(ONESTOPBIT等)
if ( ! ::SetCommState(m_hComm, & stDCB)) // 设置串口状态属性
return FALSE;
if ( ! ::SetupComm(m_hComm, 1024 , 1024 )) // 设置输入缓冲区和输出缓冲区的大小
return FALSE;
::PurgeComm(m_hComm,PURGE_TXCLEAR | PURGE_RXCLEAR); // 清空输入输出缓冲区
return TRUE;
}
// 设置超时函数
BOOL CComm::SetTimeOuts()
{
COMMTIMEOUTS stTimeOuts;
stTimeOuts.ReadIntervalTimeout = 0 ; // 设定读超时
stTimeOuts.ReadTotalTimeoutMultiplier = 100 ;
stTimeOuts.ReadTotalTimeoutConstant = 500 ;
stTimeOuts.WriteTotalTimeoutMultiplier = 100 ; // 设定写超时
stTimeOuts.WriteTotalTimeoutConstant = 500 ;
::SetCommTimeouts(m_hComm, & stTimeOuts); // 设置超时
::PurgeComm(m_hComm,PURGE_TXCLEAR | PURGE_RXCLEAR); // 清空输入输出缓冲区
return TRUE;
}
// 读串口函数
BOOL CComm::ReadComm( char * lpBuf, int nLen)
{
if (::ReadFile(m_hComm,lpBuf,nLen,(DWORD * ) & nLen,NULL) == FALSE)
{
return FALSE;
}
else
{
/*
CString str;
str.Format("%d",nLen);
AfxMessageBox(str);
*/
// ::PurgeComm(m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
return TRUE;
}
}
// 写串口函数
BOOL CComm::WriteComm( char * lpBuf, int nLen)
{
if (::WriteFile(m_hComm,lpBuf,nLen,(DWORD * ) & nLen,NULL) == FALSE)
{
return FALSE;
}
else
{
/*
CString str;
str.Format("%d",nLen);
AfxMessageBox(str);
*/
return TRUE;
}
}
#include " Comm.h "
// 构造函数
CComm::CComm()
{
}
// 析构函数
CComm:: ~ CComm()
{
CloseComm(); // 关闭串口
}
// 打开串口函数
BOOL CComm::OpenComm( int nComm)
{
CString strCommName;
CString strErrInfo;
strCommName.Format( " COM%d " ,nComm);
m_hComm = ::CreateFile(strCommName, /* 要打开串口名称 */
GENERIC_READ | GENERIC_WRITE, /* 允许读和写 */
0 , /* 独占方式 */
NULL, /* 安全属性 */
OPEN_EXISTING, /* 打开而不是创建 */
0 , /* 同步方式 */
NULL); /* 模板句柄 */
if (m_hComm == INVALID_HANDLE_VALUE)
{
strErrInfo.Format( " 打开%s失败! " ,strCommName);
AfxMessageBox(strErrInfo);
return FALSE;
}
else
{
return TRUE;
}
}
// 关闭串口函数
void CComm::CloseComm()
{
if (m_hComm != INVALID_HANDLE_VALUE)
{
::CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
}
}
// 设置串口函数
BOOL CComm::SetComm( int nBaudRate /* 波特率 */ , int nParity /* 奇偶校验位 */ , int nByteSize /* 字节位数 */ , int nStopBits /* 停止位 */ )
{
DCB stDCB;
memset( & stDCB, 0 , sizeof (stDCB));
if ( ! ::GetCommState(m_hComm, & stDCB)) // 获取串口当前状态属性
return FALSE;
stDCB.BaudRate = nBaudRate; // 波特率
stDCB.fParity = 0 ;
stDCB.Parity = nParity; // 奇偶校验位(NOPARITY等)
stDCB.ByteSize = nByteSize; // 每个字节有8位
stDCB.StopBits = nStopBits; // 停止位(ONESTOPBIT等)
if ( ! ::SetCommState(m_hComm, & stDCB)) // 设置串口状态属性
return FALSE;
if ( ! ::SetupComm(m_hComm, 1024 , 1024 )) // 设置输入缓冲区和输出缓冲区的大小
return FALSE;
::PurgeComm(m_hComm,PURGE_TXCLEAR | PURGE_RXCLEAR); // 清空输入输出缓冲区
return TRUE;
}
// 设置超时函数
BOOL CComm::SetTimeOuts()
{
COMMTIMEOUTS stTimeOuts;
stTimeOuts.ReadIntervalTimeout = 0 ; // 设定读超时
stTimeOuts.ReadTotalTimeoutMultiplier = 100 ;
stTimeOuts.ReadTotalTimeoutConstant = 500 ;
stTimeOuts.WriteTotalTimeoutMultiplier = 100 ; // 设定写超时
stTimeOuts.WriteTotalTimeoutConstant = 500 ;
::SetCommTimeouts(m_hComm, & stTimeOuts); // 设置超时
::PurgeComm(m_hComm,PURGE_TXCLEAR | PURGE_RXCLEAR); // 清空输入输出缓冲区
return TRUE;
}
// 读串口函数
BOOL CComm::ReadComm( char * lpBuf, int nLen)
{
if (::ReadFile(m_hComm,lpBuf,nLen,(DWORD * ) & nLen,NULL) == FALSE)
{
return FALSE;
}
else
{
/*
CString str;
str.Format("%d",nLen);
AfxMessageBox(str);
*/
// ::PurgeComm(m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
return TRUE;
}
}
// 写串口函数
BOOL CComm::WriteComm( char * lpBuf, int nLen)
{
if (::WriteFile(m_hComm,lpBuf,nLen,(DWORD * ) & nLen,NULL) == FALSE)
{
return FALSE;
}
else
{
/*
CString str;
str.Format("%d",nLen);
AfxMessageBox(str);
*/
return TRUE;
}
}