• 大小: 7KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-17
  • 语言: 其他
  • 标签:

资源简介

本人自己一直使用的一个简单实用的串口通讯基本类,需要使用的时候,可以直接继承该类,实现自己的数据读取方法和数据写入方法就行了。

资源截图

代码片段和文件信息

// MyCom.cpp: implementation of the MyCom class.
//
//////////////////////////////////////////////////////////////////////

#include “stdafx.h“
#include “MyCom.h“

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//错误信息输出
inline int MessageError(LPCSTR lpcszError UINT nType = MB_OK | MB_ICONWARNING)
{
CWnd *pWnd = ::AfxGetMainWnd();
if(pWnd != NULL)
return pWnd->MessageBox(lpcszError “Error“ nType);
else
return ::MessageBox(NULL lpcszError “Error“ nType);
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MyCom::MyCom()
: m_bConnected(false) 
m_ePStatus(PS_NOREADY)
{
memset(&m_Connection 0 sizeof(m_Connection) - sizeof(CCriticalSection));
}

MyCom::~MyCom()
{

}

//读取当前通讯端口缓存中的数据
UINT MyCom::CommReadBlock(HANDLE hFile LPOVERLAPPED lpOLRead LPSTR lpszBlock UINT nMaxLength)
{
BOOL       fReadStat;
COMSTAT    ComStat;
DWORD      dwErrorFlags;
DWORD      dwLength;
DWORD      dwError;

if(hFile == NULL)
return false;

//查询当前通讯缓存区的队列中的数据字节数
::ClearCommError(hFile &dwErrorFlags &ComStat);
//计算当前所需读取数据的字节数
//如果缓存区中的数据字节数较当前内存缓存字节数小 
//就读取当前所有数据;  
//如果缓存区中的数据字节数较当前内存缓存字节数大
//就读取当前内存缓存区所支持的最大字节数.)
dwLength = min(nMaxLength ComStat.cbInQue);

if(dwLength <= 0)
return 0;

//请求从当前的通讯缓存区读取数据
fReadStat = ::ReadFile(hFile lpszBlock dwLength &dwLength lpOLRead);
if(fReadStat)
return dwLength;

if(GetLastError() == ERROR_IO_PENDING)
{
//当前发生I/O重叠操作,继续等待I/O操作...
while(!GetOverlappedResult(hFile lpOLRead &dwLength true))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
continue;
else
{
//当前通讯有其它的错误发生
TRACE(““ dwError);
::ClearCommError(hFile &dwErrorFlags &ComStat);
if(dwErrorFlags > 0)
TRACE(““ dwErrorFlags);

break;
}
}
}
else
{
//当前通讯发生了一些其它的错误
dwLength = 0 ;
::ClearCommError(hFile &dwErrorFlags &ComStat);
if(dwErrorFlags > 0)
TRACE(““ dwErrorFlags);
}

return dwLength;
}

//当前的通讯端口监听线程函数
UINT MyCom::CommMonitorProc(void* pData)
{
LPCONNECTION pMPParam = (LPCONNECTION)pData;
int nLength;
char szBuffer[MAX_BUF_BLOCK + 1];

//监听当前串口数据通讯区的数据输入
while(pMPParam->hCommDev != NULL)
{
DWORD dwEvtMask = 0;

//等待当前串口通讯的一个读事件被触发
WaitCommEvent(pMPParam->hCommDev &dwEvtMask NULL);

if((dwEvtMask & EV_RXCHAR) != EV_RXCHAR)
continue;

//从串口读取数据并处理
while((nLength = CommReadBlock(pMPParam->hCommDev 
&pMPParam->olRead (LPSTR)szBuffer MAX_BUF_BLOCK)) > 0)
{
//处理从串口读出的数据
if(pMPParam->pCom != NULL)
{
pMPParam->pCom->LockThread();
pMPParam->pCom->ProcessReceivedData(szBuffer nLength);
pMPParam->pCom->UnlockThread();
}

if(::WaitForSingleobject(pMPParam->

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      13848  2009-09-13 01:09  MyCom.cpp

     文件       4608  2003-08-05 15:53  MyCom.h

----------- ---------  ---------- -----  ----

                18456                    2


评论

共有 条评论

相关资源