⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcommpkg.cpp

📁 简单实用, 功能强大的 C++ Builder 串口控件! 本控件是免费的, 不需要注册, 有关授权及许可协议详见 license.txt 文件。 1.支持二进制数据和文本数据的收发 2.支
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************\
*                                                                           *
*                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 + -