-
大小: 7KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-05-17
- 語言: 其他
- 標(biāo)簽:
資源簡介
本人自己一直使用的一個簡單實用的串口通訊基本類,需要使用的時候,可以直接繼承該類,實現(xiàn)自己的數(shù)據(jù)讀取方法和數(shù)據(jù)寫入方法就行了。

代碼片段和文件信息
//?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()
{
}
//讀取當(dāng)前通訊端口緩存中的數(shù)據(jù)
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;
//查詢當(dāng)前通訊緩存區(qū)的隊列中的數(shù)據(jù)字節(jié)數(shù)
::ClearCommError(hFile?&dwErrorFlags?&ComStat);
//計算當(dāng)前所需讀取數(shù)據(jù)的字節(jié)數(shù)
//如果緩存區(qū)中的數(shù)據(jù)字節(jié)數(shù)較當(dāng)前內(nèi)存緩存字節(jié)數(shù)小?
//就讀取當(dāng)前所有數(shù)據(jù);??
//如果緩存區(qū)中的數(shù)據(jù)字節(jié)數(shù)較當(dāng)前內(nèi)存緩存字節(jié)數(shù)大
//就讀取當(dāng)前內(nèi)存緩存區(qū)所支持的最大字節(jié)數(shù).)
dwLength?=?min(nMaxLength?ComStat.cbInQue);
if(dwLength?<=?0)
return?0;
//請求從當(dāng)前的通訊緩存區(qū)讀取數(shù)據(jù)
fReadStat?=?::ReadFile(hFile?lpszBlock?dwLength?&dwLength?lpOLRead);
if(fReadStat)
return?dwLength;
if(GetLastError()?==?ERROR_IO_PENDING)
{
//當(dāng)前發(fā)生I/O重疊操作,繼續(xù)等待I/O操作...
while(!GetOverlappedResult(hFile?lpOLRead?&dwLength?true))
{
dwError?=?GetLastError();
if(dwError?==?ERROR_IO_INCOMPLETE)
continue;
else
{
//當(dāng)前通訊有其它的錯誤發(fā)生
TRACE(““?dwError);
::ClearCommError(hFile?&dwErrorFlags?&ComStat);
if(dwErrorFlags?>?0)
TRACE(““?dwErrorFlags);
break;
}
}
}
else
{
//當(dāng)前通訊發(fā)生了一些其它的錯誤
dwLength?=?0?;
::ClearCommError(hFile?&dwErrorFlags?&ComStat);
if(dwErrorFlags?>?0)
TRACE(““?dwErrorFlags);
}
return?dwLength;
}
//當(dāng)前的通訊端口監(jiān)聽線程函數(shù)
UINT?MyCom::CommMonitorProc(void*?pData)
{
LPCONNECTION pMPParam?=?(LPCONNECTION)pData;
int nLength;
char szBuffer[MAX_BUF_BLOCK?+?1];
//監(jiān)聽當(dāng)前串口數(shù)據(jù)通訊區(qū)的數(shù)據(jù)輸入
while(pMPParam->hCommDev?!=?NULL)
{
DWORD?dwEvtMask?=?0;
//等待當(dāng)前串口通訊的一個讀事件被觸發(fā)
WaitCommEvent(pMPParam->hCommDev?&dwEvtMask?NULL);
if((dwEvtMask?&?EV_RXCHAR)?!=?EV_RXCHAR)
continue;
//從串口讀取數(shù)據(jù)并處理
while((nLength?=?CommReadBlock(pMPParam->hCommDev?
&pMPParam->olRead?(LPSTR)szBuffer?MAX_BUF_BLOCK))?>?0)
{
//處理從串口讀出的數(shù)據(jù)
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
評論
共有 條評論