一个简单的串口封装类

//---------------------------------------------------------------------------

// SerialPort.h

 

class CSerialPort
{
private:
    HANDLE  m_hComm;
public:
    CSerialPort();  // 构造函数
    ~CSerialPort();  // 析构函数

    BOOL OpenComm(int nComm);  //打开串口函数
    void CloseComm();          //关闭串口函数

    BOOL SetComm(int nBaudRate /*波特率*/,
                 int nParity /*奇偶校验位*/,
                 int nByteSize /*字节位数*/,
                 int nStopBits /*停止位*/);    //设置串口函数

    BOOL SetTimeOuts();                      //设置超时函数

    DWORD ReadComm(void* lpBuf,int nLen);    //读串口函数
    DWORD WriteComm(const void* lpBuf, int nLen);   //写串口函数
};

 

 

//---------------------------------------------------------------------------

// SerialPort.cpp

 

#include "stdafx.h"
#include "SerialPort.h"


// 功能描述:构造函数
CSerialPort::CSerialPort()
{
}

// 功能描述:析构函数
CSerialPort::~CSerialPort()
{
    CloseComm();  //关闭串口
}

// 功能描述:打开串口函数
BOOL CSerialPort::OpenComm(int nComm)
{
    CString strCommName;
    CString strErrInfo;

    strCommName.Format(_T("COM%d"), nComm);

    m_hComm = ::CreateFile(strCommName,  /*要打开串口名称*/
        GENERIC_READ | GENERIC_WRITE,  /*允许读和写*/
        0,         /*独占方式*/
        NULL,        /*安全属性*/
        OPEN_EXISTING,      /*打开而不是创建*/
        0,         /*同步方式*/
        NULL);        /*模板句柄*/

    if(m_hComm == INVALID_HANDLE_VALUE)
    {
        return FALSE;
    }

 return TRUE;
}

// 功能描述:关闭串口函数
void CSerialPort::CloseComm()
{
    if(m_hComm != INVALID_HANDLE_VALUE)
    {
        ::CloseHandle(m_hComm);
        m_hComm = INVALID_HANDLE_VALUE;
    }
}

// 功能描述:设置串口函数
BOOL CSerialPort::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 CSerialPort::SetTimeOuts()
{
    COMMTIMEOUTS stTimeOuts;
 ::GetCommTimeouts(m_hComm, &stTimeOuts);

    stTimeOuts.ReadTotalTimeoutMultiplier = 0;
    stTimeOuts.ReadTotalTimeoutConstant = 1;
    stTimeOuts.WriteTotalTimeoutMultiplier = 0;   // 设定写超时
    stTimeOuts.WriteTotalTimeoutConstant = 0;

    ::SetCommTimeouts(m_hComm,&stTimeOuts);     // 设置超时
    ::PurgeComm(m_hComm,PURGE_TXCLEAR | PURGE_RXCLEAR);  // 清空输入输出缓冲区

    return TRUE;
}

// 功能描述:读串口函数
DWORD CSerialPort::ReadComm(void* lpBuf,int nLen)
{
 DWORD  dwBytesRead = 0;
 OVERLAPPED overlap;
 memset(&overlap, 0, sizeof(overlap));

    if(::ReadFile(m_hComm, lpBuf, nLen, &dwBytesRead, &overlap) == FALSE)
    {
        return 0;
    }
    else
    {
        //::PurgeComm(m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
        return dwBytesRead;
    }
}

// 功能描述:写串口函数
DWORD CSerialPort::WriteComm(const void* lpBuf, int nLen)
{
 DWORD dwBytesWritten = 0;
 OVERLAPPED overlap;
 memset(&overlap, 0, sizeof(overlap));

    if(::WriteFile(m_hComm, lpBuf, nLen, &dwBytesWritten, &overlap) == FALSE)
    {
        return 0;
    }
    else
    {
        return dwBytesWritten;
    }
}

 

//---------------------------------------------------------------------------

// 调用方法

 

  // 首先初始化串口

  CSerialPort  m_oSerialPort;s
  m_oSerialPort.OpenComm(m_nPort);
  m_oSerialPort.SetComm(m_dwBaud, NOPARITY, 8, ONESTOPBIT);
  m_oSerialPort.SetTimeOuts();

 

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值