📄 tcommpkg.cpp
字号:
/***************************************************************************\
* *
* TCommPkg.h - 串行口通讯数据包协议, 版本 1.33 *
* Bulid: 06-17-2003 *
* Copyright (C) 1997-2002, Victor Chen *
* Homepage: http://www.cppfans.com *
* Email: victor@cppfans.com *
* *
\***************************************************************************/
#include "TCommPkg.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
namespace VictorComm32 {
//---------------------------------------------------------------------------
__fastcall TCommPackageQueue::TCommPackageQueue(unsigned long QSz, unsigned long PkgSz)
{
_QBuffer = NULL;
_Head = _Tail = 0;
SetQueue(QSz, PkgSz);
}
//---------------------------------------------------------------------------
void __fastcall TCommPackageQueue::fRemoveQueue(void)
{
if(_QBuffer)
{
delete[] _QBuffer;
_QBuffer = NULL;
}
_Head = _Tail = 0;
}
//---------------------------------------------------------------------------
void __fastcall TCommPackageQueue::SetQueue(long QSz, long PkgSz)
{
fRemoveQueue();
_QSize = QSz>2 ? QSz:2;
_PkgSize = PkgSz>32 ? PkgSz:32;
_Head = _Tail = 0;
_QBuffer = new char[_QSize*_PkgSize];
}
//---------------------------------------------------------------------------
long __fastcall TCommPackageQueue::In(const void *lpPkg)
{
if((_QBuffer) && (fGetRemain()>0))
{
memcpy(_QBuffer+_PkgSize*_Tail, lpPkg, _PkgSize); //_Buffer[_Tail] = *lpPkg;
_Tail = (_Tail+1)%_QSize;
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
long __fastcall TCommPackageQueue::Out(void *lpPkg)
{
if((_QBuffer) && (fGetCount()>0))
{
memcpy(lpPkg, _QBuffer+_PkgSize*_Head, _PkgSize); //*lpPkg = _Buffer[_Head];
_Head = (_Head+1)%_QSize;
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
long __fastcall TCommPackageQueue::Read(void *lpPkg, unsigned long iPkgNo)
{
if((_QBuffer) && (fGetCount()>0) && (iPkgNo<fGetCount()))
{
memcpy(lpPkg, _QBuffer+_PkgSize*((_Head+iPkgNo)%_QSize), _PkgSize);
return 1;
}
return 0;
}
//---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
__fastcall TCommPackage::TCommPackage(TComm32 *lpComm)
{
_bActive = false;
_bDoubleFrameMark = true;
_FRAMEHEAD = DefaultFrameHead;
_FRAMETAIL = DefaultFrameTail;
_FRAMECTRL = DefaultFrameCtrl;
_bFrameHeadDetected = false;
_bControlDetected = false;
_BufferBytesWrite = 0;
_BufferRead = NULL;
_BufferWrite = NULL;
_BufferTemp = NULL;
_QueueSize = 16;
_PackageDataSize = 4096;
_PackageType = cptCompatiblePkg;
_AllocBuffer();
_BufferRead->Length = 0;
_BufferWrite->Length = 0;
_QueueRead = new TCommPackageQueue(_QueueSize,_PackageDataSize+4); //包括字节数4字节
_QueueWrite = new TCommPackageQueue(_QueueSize,_PackageDataSize+4); //包括字节数4字节
_dwTimerInterval = 50; //50 ms
_iSkipTimerEvents = 0; //no skip
_bTimerThreadRunning = false; //not running
_bRunTimerThread = true; //run enabled
_hTimerEvent = CreateEvent(NULL, false, false, NULL); //Create Auto-Reset Event
_hTimerThreadId = _beginthread(_fnTimerThread, 4096, this);
_Comm32 = lpComm;
lpOldCommNotify = _Comm32->OnCommNotify;
lpUserCommNotify = NULL; //no default
_Comm32->OnCommNotify = fNewCommNotify;
}
//---------------------------------------------------------------------------
__fastcall TCommPackage::~TCommPackage()
{
_Comm32->OnCommNotify = lpOldCommNotify;
_bRunTimerThread = false;
SetEvent(_hTimerEvent);
for(int i=0; (i<20)&&(_bTimerThreadRunning); i++)
Sleep(5); //wait for timer thread terminate
CloseHandle(_hTimerEvent);
delete _QueueWrite;
delete _QueueRead;
_RemoveBuffer();
}
//---------------------------------------------------------------------------
void __fastcall TCommPackage::_AllocBuffer(void)
{
char *TmpBuf;
_RemoveBuffer();
TmpBuf = new char[_PackageDataSize+4]; //包括字节数4字节
_BufferRead = (TCommPackageHead*)TmpBuf;
TmpBuf = new char[_PackageDataSize*2+4+4]; //HD HD DATA*2 TL TL 包括首尾4字节,字节数4字节
_BufferWrite = (TCommPackageHead*)TmpBuf;
TmpBuf = new char[_PackageDataSize+4]; //包括字节数4字节
_BufferTemp = (TCommPackageHead*)TmpBuf;
}
//---------------------------------------------------------------------------
void __fastcall TCommPackage::_RemoveBuffer(void)
{
char *TmpBuf;
TmpBuf = (char*)_BufferTemp;
if(TmpBuf)
{
delete[]TmpBuf;
_BufferTemp = NULL;
}
TmpBuf = (char*)_BufferWrite;
if(TmpBuf)
{
delete[]TmpBuf;
_BufferWrite = NULL;
}
TmpBuf = (char*)_BufferRead;
if(TmpBuf)
{
delete[]TmpBuf;
_BufferRead = NULL;
}
}
//---------------------------------------------------------------------------
void TCommPackage::fSetQSize(unsigned long qs)
{
bool bOldActive = Active;
if(bOldActive)Active = false;
_QueueSize = qs;
_QueueRead->QSize = _QueueSize;
_QueueWrite->QSize = _QueueSize;
if(bOldActive)Active = true;
}
//---------------------------------------------------------------------------
void TCommPackage::fSetPkgSz(unsigned long ps)
{
bool bOldActive = Active;
if(bOldActive)Active = false;
_PackageDataSize = ps;
_QueueRead->PkgSize = _PackageDataSize+4; //包括字节数4字节
_QueueWrite->PkgSize = _PackageDataSize+4; //包括字节数4字节
_AllocBuffer(); //调整数据包大小
if(bOldActive)Active = true;
}
//---------------------------------------------------------------------------
void TCommPackage::fSetPkgType(TCommPackageType pt)
{
bool bOldActive = Active;
if(bOldActive)Active = false;
_PackageType = pt;
if(bOldActive)Active = true;
}
//---------------------------------------------------------------------------
void TCommPackage::fSetPkgInterval(DWORD i)
{
_dwTimerInterval = i;
SetEvent(_hTimerEvent);
}
//---------------------------------------------------------------------------
void TCommPackage::fSetDblFrameMark(bool b)
{
_bDoubleFrameMark = b;
}
//---------------------------------------------------------------------------
void __fastcall TCommPackage::fSetActive(bool b)
{
_bActive = b;
_bFrameHeadDetected = false;
_bControlDetected = false;
_BufferBytesWrite = 0;
_BufferRead->Length = 0;
_BufferWrite->Length = 0;
_QueueRead->Clear();
_QueueWrite->Clear();
SetEvent(_hTimerEvent);
}
//---------------------------------------------------------------------------
void __fastcall TCommPackage::fNewCommNotify(TObject *Sender, int NotifyType)
{
if(_bActive)
{
int UserNotify = NotifyType&~(EV_RXCHAR|EV_TXEMPTY);
if((NotifyType & EV_RXCHAR) && (_PackageType != cptFrameTimeout))
{
_ReadHeadTailPackage();
if(_QueueRead->Count)
{
UserNotify |= EV_RXCHAR;
}
}
if(NotifyType & EV_TXEMPTY)
{
_WritePackage();
if(!_QueueWrite->Count)
{
UserNotify |= EV_TXEMPTY;
}
}
if(UserNotify)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -