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; //每个字节有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;
- }
- }