|
|
|
|
#include "StdAfx.h"
|
|
|
|
|
#include "FrameIMP_Down.h"
|
|
|
|
|
|
|
|
|
|
CFrameIMPDown_::CFrameIMPDown_(void)
|
|
|
|
|
{
|
|
|
|
|
_tcscpy(Name, _T("IMP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
|
|
|
|
|
FrameLength = 6;
|
|
|
|
|
HeadLength = 1;
|
|
|
|
|
Head[0] = 0x55;
|
|
|
|
|
memcpy(Addr(), Head, HeadLength);
|
|
|
|
|
CheckLength = 1;
|
|
|
|
|
CheckPos = FrameLength - 2;
|
|
|
|
|
|
|
|
|
|
memset(&Data,0,sizeof(DataIMPDown));
|
|
|
|
|
memset(recvDataValue, 0, 6);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CFrameIMPDown_::~CFrameIMPDown_(void)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL CFrameIMPDown_::FullFrame()
|
|
|
|
|
{
|
|
|
|
|
int HeaderPos, HeaderPos2;
|
|
|
|
|
HeaderPos = FindHead(0, Length() - HeadLength); //<2F>ҵ<EFBFBD>һ<EFBFBD><D2BB>֡ͷ
|
|
|
|
|
if (0 == HeaderPos) {
|
|
|
|
|
//֡ͷ<D6A1><CDB7><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
|
|
|
|
|
if (OnCheck()) //CRCУ<43><D0A3>
|
|
|
|
|
DoCheck();
|
|
|
|
|
else {
|
|
|
|
|
if (Length() < FrameLength) //<2F><><EFBFBD>ݳ<EFBFBD><DDB3>Ȳ<EFBFBD><C8B2>㣬δͨ<CEB4><CDA8>CRCУ<43><D0A3>
|
|
|
|
|
{
|
|
|
|
|
if (Size() < FrameLength) //<2F><><EFBFBD>룬δͨ<CEB4><CDA8>CRCУ<43><D0A3>
|
|
|
|
|
{
|
|
|
|
|
DoDropBYTE((UINT16)HeadLength); //<2F><><EFBFBD><EFBFBD>֡ͷ
|
|
|
|
|
}
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
else //<2F><><EFBFBD>룬δͨ<CEB4><CDA8>CRCУ<43><D0A3>
|
|
|
|
|
{
|
|
|
|
|
HeaderPos2 = FindHead(HeadLength, Length() - HeadLength);
|
|
|
|
|
if (HeaderPos2 >= 0)
|
|
|
|
|
{
|
|
|
|
|
Drop((UINT16) HeaderPos2);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if (HeaderPos < 0) {
|
|
|
|
|
//û<>ҵ<EFBFBD>֡ͷ
|
|
|
|
|
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
|
|
|
|
|
} else {
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>֡ͷǰ<CDB7><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
DoDropBYTE((UINT16) HeaderPos);
|
|
|
|
|
}
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL CFrameIMPDown_::OnCheck()
|
|
|
|
|
{
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>֡У<D6A1><D0A3>
|
|
|
|
|
BYTE* p = Addr();
|
|
|
|
|
memcpy(recvDataValue, p, 5);
|
|
|
|
|
if (Length() < FrameLength)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struCHECK ck1=CheckCRC(p);
|
|
|
|
|
//if (p[CheckPos] == ck1.C0 && p[CheckPos + 1] == ck1.C1)//CRCУ<43><D0A3>
|
|
|
|
|
if (p[CheckPos] == ck1.C0 )//<2F><>У<EFBFBD><D0A3>
|
|
|
|
|
{
|
|
|
|
|
memcpy(recvDataValue, p, 5);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CFrameIMPDown_::DoCheck()
|
|
|
|
|
{
|
|
|
|
|
CountFrameAll++;
|
|
|
|
|
CountFrameCheck++;
|
|
|
|
|
OnDataCheck();
|
|
|
|
|
Drop(FrameLength);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struCHECK CFrameIMPDown_::CheckCRC(BYTE* const p)
|
|
|
|
|
{
|
|
|
|
|
return MakeCheckSum(p+1, FrameLength - HeadLength - CheckLength - 1);//1Ϊ֡β<D6A1><CEB2>IMP<4D><50>һ<EFBFBD><D2BB><EFBFBD>ֽڵ<D6BD>֡β
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CFrameIMPDown_::Decode()
|
|
|
|
|
{
|
|
|
|
|
ProtocalIMPDown* pBuffIMP = (ProtocalIMPDown*)Addr();
|
|
|
|
|
Data.head = pBuffIMP->head;
|
|
|
|
|
Data.Bytes = pBuffIMP->Bytes;
|
|
|
|
|
Data.StatusWord = pBuffIMP->StatusWord;
|
|
|
|
|
Data.FaultWord = pBuffIMP->FaultWord;
|
|
|
|
|
Data.CHKSUM = pBuffIMP->CHKSUM;
|
|
|
|
|
Data.EndFlag = pBuffIMP->EndFlag;
|
|
|
|
|
}
|