You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
2.2 KiB
C++

#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;
}