//---------------------------------------------------------------------------
// SerialPort.h
class CSerialPort
{
private:
HANDLE m_hComm;
public:
CSerialPort(); // 构造函数
~CSerialPort(); // 析构函数
BOOL OpenComm(int nComm); //打开串口函数
void CloseComm(); //关闭串口函数
BOOL SetComm(int nBaudRate /*波特率*/,
int nParity /*奇偶校验位*/,
int nByteSize /*字节位数*/,
int nStopBits /*停止位*/); //设置串口函数
BOOL SetTimeOuts(); //设置超时函数
DWORD ReadComm(void* lpBuf,int nLen); //读串口函数
DWORD WriteComm(const void* lpBuf, int nLen); //写串口函数
};
//---------------------------------------------------------------------------
// SerialPort.cpp
#include "stdafx.h"
#include "SerialPort.h"
// 功能描述:构造函数
CSerialPort::CSerialPort()
{
}
// 功能描述:析构函数
CSerialPort::~CSerialPort()
{
CloseComm(); //关闭串口
}
// 功能描述:打开串口函数
BOOL CSerialPort::OpenComm(int nComm)
{
CString strCommName;
CString strErrInfo;
strCommName.Format(_T("COM%d"), nComm);
m_hComm = ::CreateFile(strCommName, /*要打开串口名称*/
GENERIC_READ | GENERIC_WRITE, /*允许读和写*/
0, /*独占方式*/
NULL, /*安全属性*/
OPEN_EXISTING, /*打开而不是创建*/
0, /*同步方式*/
NULL); /*模板句柄*/
if(m_hComm == INVALID_HANDLE_VALUE)
{
return FALSE;
}
return TRUE;
}
// 功能描述:关闭串口函数
void CSerialPort::CloseComm()
{
if(m_hComm != INVALID_HANDLE_VALUE)
{
::CloseHandle(m_hComm);
m_hComm = INVALID_HANDLE_VALUE;
}
}
// 功能描述:设置串口函数
BOOL CSerialPort::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; // 每个字节有位
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 CSerialPort::SetTimeOuts()
{
COMMTIMEOUTS stTimeOuts;
::GetCommTimeouts(m_hComm, &stTimeOuts);
stTimeOuts.ReadTotalTimeoutMultiplier = 0;
stTimeOuts.ReadTotalTimeoutConstant = 1;
stTimeOuts.WriteTotalTimeoutMultiplier = 0; // 设定写超时
stTimeOuts.WriteTotalTimeoutConstant = 0;
::SetCommTimeouts(m_hComm,&stTimeOuts); // 设置超时
::PurgeComm(m_hComm,PURGE_TXCLEAR | PURGE_RXCLEAR); // 清空输入输出缓冲区
return TRUE;
}
// 功能描述:读串口函数
DWORD CSerialPort::ReadComm(void* lpBuf,int nLen)
{
DWORD dwBytesRead = 0;
OVERLAPPED overlap;
memset(&overlap, 0, sizeof(overlap));
if(::ReadFile(m_hComm, lpBuf, nLen, &dwBytesRead, &overlap) == FALSE)
{
return 0;
}
else
{
//::PurgeComm(m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
return dwBytesRead;
}
}
// 功能描述:写串口函数
DWORD CSerialPort::WriteComm(const void* lpBuf, int nLen)
{
DWORD dwBytesWritten = 0;
OVERLAPPED overlap;
memset(&overlap, 0, sizeof(overlap));
if(::WriteFile(m_hComm, lpBuf, nLen, &dwBytesWritten, &overlap) == FALSE)
{
return 0;
}
else
{
return dwBytesWritten;
}
}
//---------------------------------------------------------------------------
// 调用方法
// 首先初始化串口
CSerialPort m_oSerialPort;s
m_oSerialPort.OpenComm(m_nPort);
m_oSerialPort.SetComm(m_dwBaud, NOPARITY, 8, ONESTOPBIT);
m_oSerialPort.SetTimeOuts();
...