API串口操作封装类(转)
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
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; //每个字节有位 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; } }