中级会员
 
- 积分
- 358
- 金钱
- 358
- 注册时间
- 2017-8-16
- 在线时间
- 60 小时
|

楼主 |
发表于 2021-4-9 08:49:47
|
显示全部楼层
- UINT8 CalcCrc (SAFETY_PDU* psPacket , UINT16 startCrc , UINT16* seqNo , UINT16 oldCrc , UINT8 bRcvDir ,UINT8 size)
- {
- UINT8 bSuccess = false ;
- UINT16 w1 , w2 ;
- // temporaryvalues
- UINT16 crc ;
- UINT16 crc_common ;
- // commonpartof CRCcalculation ,
- // includes CRC_0 , Conn-ID , Sequence-No. , Cmd
- UINT8* pCrc = &psPacket->au8Data [2]; // pointerto CRC Low-Byte
- UINT8* pSafeData;
- // pointerto SafeData Low-Byte
- if (size > 6)
- // that means2 ora multipleoftwosafetydata
- pCrc++ ;
- // →Crc0 Low-Byteat Byteoffset3insteadof2
- do
- {
- crc = 0 ;
- // reset crc
- // Sequence for calcultaion :
- // old CRC-Lo , old CRC-Hi , ConnId-Lo , ConnId-Hi , SeqNo-Lo , SeqNo-Hi , Command ,
- // (Index ,) Data
- // CRC-Lo
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- // lookatthe CRC-table
- w2 = aCrcTab2 [((UINT8*) &startCrc)[0]];
- // lookatthe CRC-table
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // CRC-Hi
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [((UINT8*) &startCrc)[1]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // ConnId-Lo
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [psPacket->au8Data [size-2]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // ConnId-Hi
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [psPacket->au8Data [size-1]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // SeqNo-Lo
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [((UINT8*) seqNo)[LO_BYTE]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // SeqNo-Hi
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [((UINT8*) seqNo)[HI_BYTE]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // Command
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [psPacket->au8Data [OFFS_COMMAND]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // CRCpartthatiscommonforallothercrc-calculationsissaved
- crc_common=crc ;
- // Data [0]
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [psPacket->au8Data [OFFS_DATA]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // if2 Byte Safetydata→calculatenext Byteintothecrc
- if (size > 6)
- {
- // Data [1]
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [psPacket->au8Data [OFFS_DATA+1]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- }
- // UPDATE_SEQ_NO
- seqNo [0] ++ ;
- if (seqNo [0] == 0)
- seqNo [0] ++ ;
- } while (crc == oldCrc && (bRcvDir & NEW_CRC) != 0) ;
- // aslongasresultingcrcisthesamelikeoldCrc
- if (bRcvDir)
- // for receive direction
- {
- if (((UINT8*) &crc)[HI_BYTE] == pCrc [OFFS_CRC_HI-OFFS_CRC_LO]
- && ((UINT8*) &crc)[LO_BYTE] == pCrc [0])
- {
- // for receive direction
- // CRC is correct
- bSuccess=true ;
- }
- }
- else
- // for send direction
- {
- // insert Checksum
- pCrc [OFFS_CRC_HI-OFFS_CRC_LO] = ((UINT8*)&crc)[HI_BYTE];
- pCrc [0] = ((UINT8*)&crc)[LO_BYTE];
- }
- // if more than 2 Byte Safety Data a retransferred ,
- // CRC_1 and so forth must be calculated
- if (size > 10)
- {
- UINT16 i = 1 ;
- pSafeData = pCrc+2 ;
- // setpSafeDatatothe SafeData Low-Byte
- // ofthenextpart=SafeData [2]
- pCrc += 4 ;
- // setpCrcto CRC_i Low-Byte
- size-= 7 ;
- // substractfirstpartoftheframe
- while (size >=4)
- // aslongasotherpartsfollow
- {
- // Start-CRC
- crc = crc_common ;
- // this partisalreadycalculatedabove
- // i (Bit0-7)
- // calculateindex
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [((UINT8*) &i)[LO_BYTE]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // i (Bit8-15)
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [((UINT8*) &i)[HI_BYTE]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // Data2*i
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [pSafeData [0]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- // Data2*i+1
- w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
- w2 = aCrcTab2 [pSafeData [1]];
- w1 = w1 ^ w2 ;
- ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
- ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
- if (((UINT8*) &crc)[HI_BYTE] == pCrc [1]&& ((UINT8*) &crc)[LO_BYTE] == pCrc [0])
- {
- // CRCiscorrect
- }
- else
- {
- bSuccess=false ;
- if (bRcvDir == 0)
- // forsenddirection
- {
- // insert Checksum
- pCrc [1] = ((UINT8*)
- &crc)[HI_BYTE];
- pCrc [0] = ((UINT8*)
- &crc)[LO_BYTE];
- }
- }
- size
- -=4 ;
- // substractthis partoftheframe
- pSafeData += 4 ;
- // setto nextSafeData Low Byte
- pCrc += 4 ;
- // setto next CRC_i Low Byte
- i++ ;
- // incrementIndex
- }
- }
- return bSuccess ;
- }
- [code]UINT16 aCrcTab1[266] ={
- 0x0000 , 0x39B7 , 0x736E , 0x4AD9 , 0xE6DC , 0xDF6B , 0x95B2 , 0xAC05 , 0xF40F , 0xCDB8 ,
- 0x8761 , 0xBED6 , 0x12D3 , 0x2B64 , 0x61BD , 0x580A , 0xD1A9 , 0xE81E , 0xA2C7 , 0x9B70 ,
- 0x3775 , 0x0EC2 , 0x441B , 0x7DAC , 0x25A6 , 0x1C11 , 0x56C8 , 0x6F7F , 0xC37A , 0xFACD ,
- 0xB014 , 0x89A3 , 0x9AE5 , 0xA352 , 0xE98B , 0xD03C , 0x7C39 , 0x458E , 0x0F57 , 0x36E0 ,
- 0x6EEA , 0x575D , 0x1D84 , 0x2433 , 0x8836 , 0xB181 , 0xFB58 , 0xC2EF , 0x4B4C , 0x72FB ,
- 0x3822 , 0x0195 , 0xAD90 , 0x9427 , 0xDEFE , 0xE749 , 0xBF43 , 0x86F4 , 0xCC2D , 0xF59A ,
- 0x599F , 0x6028 , 0x2AF1 , 0x1346 , 0x0C7D , 0x35CA , 0x7F13 , 0x46A4 , 0xEAA1 , 0xD316 ,
- 0x99CF , 0xA078 , 0xF872 , 0xC1C5 , 0x8B1C , 0xB2AB , 0x1EAE , 0x2719 , 0x6DC0 , 0x5477 ,
- 0xDDD4 , 0xE463 , 0xAEBA , 0x970D , 0x3B08 , 0x02BF , 0x4866 , 0x71D1 , 0x29DB , 0x106C ,
- 0x5AB5 , 0x6302 , 0xCF07 , 0xF6B0 , 0xBC69 , 0x85DE , 0x9698 , 0xAF2F , 0xE5F6 , 0xDC41 ,
- 0x7044 , 0x49F3 , 0x032A , 0x3A9D , 0x6297 , 0x5B20 , 0x11F9 , 0x284E , 0x844B , 0xBDFC ,
- 0xF725 , 0xCE92 , 0x4731 , 0x7E86 , 0x345F , 0x0DE8 , 0xA1ED , 0x985A , 0xD283 , 0xEB34 ,
- 0xB33E , 0x8A89 , 0xC050 , 0xF9E7 , 0x55E2 , 0x6C55 , 0x268C , 0x1F3B , 0x18FA , 0x214D ,
- 0x6B94 , 0x5223 , 0xFE26 , 0xC791 , 0x8D48 , 0xB4FF , 0xECF5 , 0xD542 , 0x9F9B , 0xA62C ,
- 0x0A29 , 0x339E , 0x7947 , 0x40F0 , 0xC953 , 0xF0E4 , 0xBA3D , 0x838A , 0x2F8F , 0x1638 ,
- 0x5CE1 , 0x6556 , 0x3D5C , 0x04EB , 0x4E32 , 0x7785 , 0xDB80 , 0xE237 , 0xA8EE , 0x9159 ,
- 0x821F , 0xBBA8 , 0xF171 , 0xC8C6 , 0x64C3 , 0x5D74 , 0x17AD , 0x2E1A , 0x7610 , 0x4FA7 ,
- 0x057E , 0x3CC9 , 0x90CC , 0xA97B , 0xE3A2 , 0xDA15 , 0x53B6 , 0x6A01 , 0x20D8 , 0x196F ,
- 0xB56A , 0x8CDD , 0xC604 , 0xFFB3 , 0xA7B9 , 0x9E0E , 0xD4D7 , 0xED60 , 0x4165 , 0x78D2 ,
- 0x320B , 0x0BBC , 0x1487 , 0x2D30 , 0x67E9 , 0x5E5E , 0xF25B , 0xCBEC , 0x8135 , 0xB882 ,
- 0xE088 , 0xD93F , 0x93E6 , 0xAA51 , 0x0654 , 0x3FE3 , 0x753A , 0x4C8D , 0xC52E , 0xFC99 ,
- 0xB640 , 0x8FF7 , 0x23F2 , 0x1A45 , 0x509C , 0x692B , 0x3121 , 0x0896 , 0x424F , 0x7BF8 ,
- 0xD7FD , 0xEE4A , 0xA493 , 0x9D24 , 0x8E62 , 0xB7D5 , 0xFD0C , 0xC4BB , 0x68BE , 0x5109 ,
- 0x1BD0 , 0x2267 , 0x7A6D , 0x43DA , 0x0903 , 0x30B4 , 0x9CB1 , 0xA506 , 0xEFDF , 0xD668 ,
- 0x5FCB , 0x667C , 0x2CA5 , 0x1512 , 0xB917 , 0x80A0 , 0xCA79 , 0xF3CE , 0xABC4 , 0x9273 ,
- 0xD8AA , 0xE11D , 0x4D18 , 0x74AF , 0x3E76 , 0x07C1 };
- //aCrcTab2 : ARRAY [ 0..255 ] OF WORD : =
- UINT16 aCrcTab2[266] ={
- 0x0000 , 0x7648 , 0xEC90 , 0x9AD8 , 0xE097 , 0x96DF , 0x0C07 , 0x7A4F , 0xF899 , 0x8ED1 ,
- 0x1409 , 0x6241 , 0x180E , 0x6E46 , 0xF49E , 0x82D6 , 0xC885 , 0xBECD , 0x2415 , 0x525D ,
- 0x2812 , 0x5E5A , 0xC482 , 0xB2CA , 0x301C , 0x4654 , 0xDC8C , 0xAAC4 , 0xD08B , 0xA6C3 ,
- 0x3C1B , 0x4A53 , 0xA8BD , 0xDEF5 , 0x442D , 0x3265 , 0x482A , 0x3E62 , 0xA4BA , 0xD2F2 ,
- 0x5024 , 0x266C , 0xBCB4 , 0xCAFC , 0xB0B3 , 0xC6FB , 0x5C23 , 0x2A6B , 0x6038 , 0x1670 ,
- 0x8CA8 , 0xFAE0 , 0x80AF , 0xF6E7 , 0x6C3F , 0x1A77 , 0x98A1 , 0xEEE9 , 0x7431 , 0x0279 ,
- 0x7836 , 0x0E7E , 0x94A6 , 0xE2EE , 0x68CD , 0x1E85 , 0x845D , 0xF215 , 0x885A , 0xFE12 ,
- 0x64CA , 0x1282 , 0x9054 , 0xE61C , 0x7CC4 , 0x0A8C , 0x70C3 , 0x068B , 0x9C53 , 0xEA1B ,
- 0xA048 , 0xD600 , 0x4CD8 , 0x3A90 , 0x40DF , 0x3697 , 0xAC4F , 0xDA07 , 0x58D1 , 0x2E99 ,
- 0xB441 , 0xC209 , 0xB846 , 0xCE0E , 0x54D6 , 0x229E , 0xC070 , 0xB638 , 0x2CE0 , 0x5AA8 ,
- 0x20E7 , 0x56AF , 0xCC77 , 0xBA3F , 0x38E9 , 0x4EA1 , 0xD479 , 0xA231 , 0xD87E , 0xAE36 ,
- 0x34EE , 0x42A6 , 0x08F5 , 0x7EBD , 0xE465 , 0x922D , 0xE862 , 0x9E2A , 0x04F2 , 0x72BA ,
- 0xF06C , 0x8624 , 0x1CFC , 0x6AB4 , 0x10FB , 0x66B3 , 0xFC6B , 0x8A23 , 0xD19A , 0xA7D2 ,
- 0x3D0A , 0x4B42 , 0x310D , 0x4745 , 0xDD9D , 0xABD5 , 0x2903 , 0x5F4B , 0xC593 , 0xB3DB ,
- 0xC994 , 0xBFDC , 0x2504 , 0x534C , 0x191F , 0x6F57 , 0xF58F , 0x83C7 , 0xF988 , 0x8FC0 ,
- 0x1518 , 0x6350 , 0xE186 , 0x97CE , 0x0D16 , 0x7B5E , 0x0111 , 0x7759 , 0xED81 , 0x9BC9 ,
- 0x7927 , 0x0F6F , 0x95B7 , 0xE3FF , 0x99B0 , 0xEFF8 , 0x7520 , 0x0368 , 0x81BE , 0xF7F6 ,
- 0x6D2E , 0x1B66 , 0x6129 , 0x1761 , 0x8DB9 , 0xFBF1 , 0xB1A2 , 0xC7EA , 0x5D32 , 0x2B7A ,
- 0x5135 , 0x277D , 0xBDA5 , 0xCBED , 0x493B , 0x3F73 , 0xA5AB , 0xD3E3 , 0xA9AC , 0xDFE4 ,
- 0x453C , 0x3374 , 0xB957 , 0xCF1F , 0x55C7 , 0x238F , 0x59C0 , 0x2F88 , 0xB550 , 0xC318 ,
- 0x41CE , 0x3786 , 0xAD5E , 0xDB16 , 0xA159 , 0xD711 , 0x4DC9 , 0x3B81 , 0x71D2 , 0x079A ,
- 0x9D42 , 0xEB0A , 0x9145 , 0xE70D , 0x7DD5 , 0x0B9D , 0x894B , 0xFF03 , 0x65DB , 0x1393 ,
- 0x69DC , 0x1F94 , 0x854C , 0xF304 , 0x11EA , 0x67A2 , 0xFD7A , 0x8B32 , 0xF17D , 0x8735 ,
- 0x1DED , 0x6BA5 , 0xE973 , 0x9F3B , 0x05E3 , 0x73AB , 0x09E4 , 0x7FAC , 0xE574 , 0x933C ,
- 0xD96F , 0xAF27 , 0x35FF , 0x43B7 , 0x39F8 , 0x4FB0 , 0xD568 , 0xA320 , 0x21F6 , 0x57BE ,
- 0xCD66 , 0xBB2E , 0xC161 , 0xB729 , 0x2DF1 , 0x5BB9 };
复制代码 [/code] |
|