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

转载于:https://www.cnblogs.com/ZYM/archive/2008/10/22/1317144.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值