API串口操作封装类

来源:互联网 发布:C语言cost 编辑:程序博客网 时间:2024/06/05 06:24
Comm.h头文件:
  1. #ifndef __CCOMM_H__
  2. #define __CCOMM_H__
  3. class CComm  //串口操作封装类
  4. {
  5. private:
  6.     HANDLE m_hComm;
  7. public:
  8.     CComm();  //构造函数
  9.     ~CComm();  //析构函数
  10.     BOOL OpenComm(int nComm);  //打开串口函数
  11.     void CloseComm();  //关闭串口函数
  12.     BOOL SetComm(int nBaudRate/*波特率*/,int nParity/*奇偶校验位*/,int nByteSize/*字节位数*/,int nStopBits/*停止位*/);  //设置串口函数
  13.     BOOL SetTimeOuts();  //设置超时函数
  14.     BOOL ReadComm(char * lpBuf,int nLen);  //读串口函数
  15.     BOOL WriteComm(char * lpBuf,int nLen);  //写串口函数
  16. };
  17. #endif

Comm.cpp实现文件:

  1. #include "StdAfx.h"
  2. #include "Comm.h"
  3. //构造函数
  4. CComm::CComm()
  5. {
  6. }
  7. //析构函数
  8. CComm::~CComm()
  9. {
  10.     CloseComm();  //关闭串口
  11. }
  12. //打开串口函数
  13. BOOL CComm::OpenComm(int nComm)
  14. {
  15.     CString strCommName;
  16.     CString strErrInfo;
  17.     strCommName.Format("COM%d",nComm);
  18.     m_hComm = ::CreateFile(strCommName,  /*要打开串口名称*/
  19.                         GENERIC_READ | GENERIC_WRITE,  /*允许读和写*/
  20.                         0,  /*独占方式*/
  21.                         NULL,  /*安全属性*/
  22.                         OPEN_EXISTING,  /*打开而不是创建*/
  23.                         0, /*同步方式*/
  24.                         NULL);  /*模板句柄*/
  25.     if(m_hComm == INVALID_HANDLE_VALUE)
  26.     {
  27.         strErrInfo.Format("打开%s失败!",strCommName);
  28.         AfxMessageBox(strErrInfo);
  29.         return FALSE;
  30.     }
  31.     else
  32.     {
  33.         return TRUE;
  34.     }
  35. }
  36. //关闭串口函数
  37. void CComm::CloseComm()
  38. {
  39.     if(m_hComm != INVALID_HANDLE_VALUE)
  40.     {
  41.         ::CloseHandle(m_hComm);
  42.         m_hComm = INVALID_HANDLE_VALUE;
  43.     }
  44. }
  45. //设置串口函数
  46. BOOL CComm::SetComm(int nBaudRate/*波特率*/,int nParity/*奇偶校验位*/,int nByteSize/*字节位数*/,int nStopBits/*停止位*/)
  47. {
  48.     DCB stDCB;
  49.     memset(&stDCB,0,sizeof(stDCB));
  50.     if(!::GetCommState(m_hComm,&stDCB))  //获取串口当前状态属性
  51.         return FALSE;
  52.     stDCB.BaudRate = nBaudRate;  //波特率
  53.     stDCB.fParity = 0;
  54.     stDCB.Parity = nParity;  //奇偶校验位(NOPARITY等)
  55.     stDCB.ByteSize = nByteSize;  //每个字节有8位
  56.     stDCB.StopBits = nStopBits;  //停止位(ONESTOPBIT等)
  57.     if(!::SetCommState(m_hComm,&stDCB))  //设置串口状态属性
  58.         return FALSE;
  59.     if(!::SetupComm(m_hComm,1024,1024))  //设置输入缓冲区和输出缓冲区的大小
  60.         return FALSE;
  61.     ::PurgeComm(m_hComm,PURGE_TXCLEAR | PURGE_RXCLEAR);  //清空输入输出缓冲区
  62.     return TRUE;
  63. }
  64. //设置超时函数
  65. BOOL CComm::SetTimeOuts()
  66. {
  67.     COMMTIMEOUTS stTimeOuts;
  68.     stTimeOuts.ReadIntervalTimeout = 0;  //设定读超时
  69.     stTimeOuts.ReadTotalTimeoutMultiplier = 100;
  70.     stTimeOuts.ReadTotalTimeoutConstant = 500;
  71.     stTimeOuts.WriteTotalTimeoutMultiplier = 100;  //设定写超时
  72.     stTimeOuts.WriteTotalTimeoutConstant = 500;
  73.     ::SetCommTimeouts(m_hComm,&stTimeOuts);  //设置超时
  74.     ::PurgeComm(m_hComm,PURGE_TXCLEAR | PURGE_RXCLEAR);  //清空输入输出缓冲区
  75.     return TRUE;
  76. }
  77. //读串口函数
  78. BOOL CComm::ReadComm(char * lpBuf,int nLen)
  79. {
  80.     if(::ReadFile(m_hComm,lpBuf,nLen,(DWORD *)&nLen,NULL) == FALSE)
  81.     {
  82.         return FALSE;
  83.     }
  84.     else
  85.     {
  86.         /*
  87.         CString str;
  88.         str.Format("%d",nLen);
  89.         AfxMessageBox(str);
  90.         */
  91.         
  92.         //::PurgeComm(m_hComm,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
  93.         return TRUE;
  94.     }
  95. }
  96. //写串口函数
  97. BOOL CComm::WriteComm(char * lpBuf,int nLen)
  98. {
  99.     if(::WriteFile(m_hComm,lpBuf,nLen,(DWORD *)&nLen,NULL) == FALSE)
  100.     {
  101.         return FALSE;
  102.     }
  103.     else
  104.     {
  105.         /*
  106.         CString str;
  107.         str.Format("%d",nLen);
  108.         AfxMessageBox(str);
  109.         */
  110.         return TRUE;
  111.     }
  112. }

 

原创粉丝点击