资源简介
本人自己一直使用的一个简单实用的串口通讯基本类,需要使用的时候,可以直接继承该类,实现自己的数据读取方法和数据写入方法就行了。
代码片段和文件信息
// 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
评论
共有 条评论