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;
    }
}
posted @ 2009-03-17 15:33  木瓜脑袋  阅读(1260)  评论(0编辑  收藏  举报