zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    QTP 11.05下载并完成+皴
    ZOJ Monthly, June 2014 月赛BCDEFGH题题解
    Linux makefile 教程 很具体,且易懂
    oracle中imp命令具体解释
    html5实现摇一摇
    AfxMessageBox和MessageBox差别
    Android传感器概述(六)
    线性代数之矩阵与坐标系的转换
    測试新浪微博@小冰 为代码机器人的一些方法
    破解中国电信华为无线猫路由(HG522-C)自己主动拨号+不限电脑数+iTV
  • 原文地址:https://www.cnblogs.com/ZYM/p/1317144.html
Copyright © 2011-2022 走看看