#include "StdAfx.h" #include "FrameIMP_Down.h" CFrameIMPDown_::CFrameIMPDown_(void) { _tcscpy(Name, _T("IMP下行")); 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); //找第一个帧头 if (0 == HeaderPos) { //帧头在最前面 if (OnCheck()) //CRC校验 DoCheck(); else { if (Length() < FrameLength) //数据长度不足,未通过CRC校验 { if (Size() < FrameLength) //误码,未通过CRC校验 { DoDropBYTE((UINT16)HeadLength); //丢弃帧头 } return TRUE; } else //误码,未通过CRC校验 { 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) { //没找到帧头 DoDropBYTE((UINT16) (Length()-(HeadLength-1))); } else { //丢弃帧头前的数据 DoDropBYTE((UINT16) HeaderPos); } return FALSE; } BOOL CFrameIMPDown_::OnCheck() { //数据帧校验 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校验 if (p[CheckPos] == ck1.C0 )//和校验 { 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为帧尾,IMP有一个字节的帧尾 } 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; }