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
#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;
}
}
分类:
VC
标签:
API串口操作封装类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述