OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5094|回复: 1

gb/t 36006 控制与通讯网络 哈希函数计算

[复制链接]

10

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2017-8-16
在线时间
60 小时
发表于 2021-4-8 15:36:13 | 显示全部楼层 |阅读模式
以下安全 PDU 的代码给出 了一个关于如何计算安全 PDU CRC 的示例。 尾随的 3 个 0 已 经考虑
在内。
****************************************************************
** Parameter : psPacket - FSCP12 / 1 Safety PDU
** startCrc - Startvalueof CRC Calculatoin
** seqNo - SeqNo
**
oldCRC - CRC _ 0 ofthelastreceived / send SafetySlave PDU
**
bRcvDir - bRcvDir=True : calcof CRCsofthereceived Frame
**
bRcvDir=False : calcof CRCsforthesend Frame
**
size
-sizeofSafety PDU
**
** Return :
bSuccess- TRUE : CRCkorrekt
**
*************************************************************** /
UINT8 CalcCrc ( SAFETY _ PDU * psPacket , UINT16 startCrc , UINT16 * seqNo , UINT16 oldCrc , UINT8 bRcvDir ,
UINT8size )
{
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 ;
// resetcrc
// Sequenceforcalcultaion :
// 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 )
// forreceivedirection
{
if ( (( UINT8 * ) &crc )[ HI _ BYTE ] = =pCrc [ OFFS _ CRC _ HI-OFFS _ CRC _ LO ]
&& (( UINT8 * ) &crc )[ LO _ BYTE ] = =pCrc [ 0 ] )
{
// forreceivedirection
// CRCiscorrect
bSuccess=TRUE ;
}
}
else
// forsenddirection
{
// insert Checksum
pCrc [ OFFS _ CRC _ HI-OFFS _ CRC _ LO ] = (( UINT8 * )
&crc )[ HI _ BYTE ];
pCrc [ 0 ] = (( UINT8 * )
&crc )[ LO _ BYTE ];
}
// if morethan2 Byte Safety Dataaretransferred ,
// CRC _ 1 andsoforth mustbecalculated
if ( size > 10 )
{
UINT16i =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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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 XOR w2 ;
(( UINT8 * ) &crc )[ HI _ BYTE ] = (( UINT8 * ) &w1 )[ HI _ BYTE ] XOR (( 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
pCrc0
+=4 ;
// setto next CRC _ i Low Byte
i++ ;
// incrementIndex
}
}
returnbSuccess ;
}

aCrcTab1 : ARRAY [ 0..255 ] OF WORD : =
16#0000 , 16#39B7 , 16#736E , 16#4AD9 , 16#E6DC , 16#DF6B , 16#95B2 , 16# AC05 , 16#F40F , 16#CDB8 ,
16#8761 , 16#BED6 , 16#12D3 , 16#2B64 , 16#61BD , 16#580A , 16#D1A9 , 16#E81E , 16# A2C7 , 16#9B70 ,
16#3775 , 16#0EC2 , 16#441B , 16#7DAC , 16#25A6 , 16#1C11 , 16#56C8 , 16#6F7F , 16#C37A , 16#FACD ,
16#B014 , 16#89A3 , 16#9AE5 , 16# A352 , 16#E98B , 16#D03C , 16#7C39 , 16#458E , 16#0F57 , 16#36E0 ,
16#6EEA , 16#575D , 16#1D84 , 16#2433 , 16#8836 , 16#B181 , 16#FB58 , 16#C2EF , 16#4B4C , 16#72FB ,
16#3822 , 16#0195 , 16# AD90 , 16#9427 , 16#DEFE , 16#E749 , 16#BF43 , 16#86F4 , 16#CC2D , 16#F59A ,
16#599F , 16#6028 , 16#2AF1 , 16#1346 , 16#0C7D , 16#35CA , 16#7F13 , 16#46A4 , 16#EAA1 , 16#D316 ,
16#99CF , 16# A078 , 16#F872 , 16#C1C5 , 16#8B1C , 16#B2AB , 16#1EAE , 16#2719 , 16#6DC0 , 16#5477 ,
16#DDD4 , 16#E463 , 16# AEBA , 16#970D , 16#3B08 , 16#02BF , 16#4866 , 16#71D1 , 16#29DB , 16#106C ,
16#5AB5 , 16#6302 , 16#CF07 , 16#F6B0 , 16#BC69 , 16#85DE , 16#9698 , 16# AF2F , 16#E5F6 , 16#DC41 ,
16#7044 , 16#49F3 , 16#032A , 16#3A9D , 16#6297 , 16#5B20 , 16#11F9 , 16#284E , 16#844B , 16#BDFC ,
16#F725 , 16#CE92 , 16#4731 , 16#7E86 , 16#345F , 16#0DE8 , 16# A1ED , 16#985A , 16#D283 , 16#EB34 ,
16#B33E , 16#8A89 , 16#C050 , 16#F9E7 , 16#55E2 , 16#6C55 , 16#268C , 16#1F3B , 16#18FA , 16#214D ,
16#6B94 , 16#5223 , 16#FE26 , 16#C791 , 16#8D48 , 16#B4FF , 16#ECF5 , 16#D542 , 16#9F9B , 16# A62C ,
16#0A29 , 16#339E , 16#7947 , 16#40F0 , 16#C953 , 16#F0E4 , 16#BA3D , 16#838A , 16#2F8F , 16#1638 ,
16#5CE1 , 16#6556 , 16#3D5C , 16#04EB , 16#4E32 , 16#7785 , 16#DB80 , 16#E237 , 16# A8EE , 16#9159 ,
16#821F , 16#BBA8 , 16#F171 , 16#C8C6 , 16#64C3 , 16#5D74 , 16#17AD , 16#2E1A , 16#7610 , 16#4FA7 ,
16#057E , 16#3CC9 , 16#90CC , 16# A97B , 16#E3A2 , 16#DA15 , 16#53B6 , 16#6A01 , 16#20D8 , 16#196F ,
16#B56A , 16#8CDD , 16#C604 , 16#FFB3 , 16# A7B9 , 16#9E0E , 16#D4D7 , 16#ED60 , 16#4165 , 16#78D2 ,
16#320B , 16#0BBC , 16#1487 , 16#2D30 , 16#67E9 , 16#5E5E , 16#F25B , 16#CBEC , 16#8135 , 16#B882 ,
16#E088 , 16#D93F , 16#93E6 , 16# AA51 , 16#0654 , 16#3FE3 , 16#753A , 16#4C8D , 16#C52E , 16#FC99 ,
16#B640 , 16#8FF7 , 16#23F2 , 16#1A45 , 16#509C , 16#692B , 16#3121 , 16#0896 , 16#424F , 16#7BF8 ,
16#D7FD , 16#EE4A , 16# A493 , 16#9D24 , 16#8E62 , 16#B7D5 , 16#FD0C , 16#C4BB , 16#68BE , 16#5109 ,
16#1BD0 , 16#2267 , 16#7A6D , 16#43DA , 16#0903 , 16#30B4 , 16#9CB1 , 16# A506 , 16#EFDF , 16#D668 ,
16#5FCB , 16#667C , 16#2CA5 , 16#1512 , 16#B917 , 16#80A0 , 16#CA79 , 16#F3CE , 16# ABC4 , 16#9273 ,
16#D8AA , 16#E11D , 16#4D18 , 16#74AF , 16#3E76 , 16#07C1 ;


aCrcTab2 : ARRAY [ 0..255 ] OF WORD : =
16#0000 , 16#7648 , 16#EC90 , 16#9AD8 , 16#E097 , 16#96DF , 16#0C07 , 16#7A4F , 16#F899 , 16#8ED1 ,
16#1409 , 16#6241 , 16#180E , 16#6E46 , 16#F49E , 16#82D6 , 16#C885 , 16#BECD , 16#2415 , 16#525D ,
16#2812 , 16#5E5A , 16#C482 , 16#B2CA , 16#301C , 16#4654 , 16#DC8C , 16# AAC4 , 16#D08B , 16# A6C3 ,
16#3C1B , 16#4A53 , 16# A8BD , 16#DEF5 , 16#442D , 16#3265 , 16#482A , 16#3E62 , 16# A4BA , 16#D2F2 ,
16#5024 , 16#266C , 16#BCB4 , 16#CAFC , 16#B0B3 , 16#C6FB , 16#5C23 , 16#2A6B , 16#6038 , 16#1670 ,
16#8CA8 , 16#FAE0 , 16#80AF , 16#F6E7 , 16#6C3F , 16#1A77 , 16#98A1 , 16#EEE9 , 16#7431 , 16#0279 ,
16#7836 , 16#0E7E , 16#94A6 , 16#E2EE , 16#68CD , 16#1E85 , 16#845D , 16#F215 , 16#885A , 16#FE12 ,
16#64CA , 16#1282 , 16#9054 , 16#E61C , 16#7CC4 , 16#0A8C , 16#70C3 , 16#068B , 16#9C53 , 16#EA1B ,
16# A048 , 16#D600 , 16#4CD8 , 16#3A90 , 16#40DF , 16#3697 , 16# AC4F , 16#DA07 , 16#58D1 , 16#2E99 ,
16#B441 , 16#C209 , 16#B846 , 16#CE0E , 16#54D6 , 16#229E , 16#C070 , 16#B638 , 16#2CE0 , 16#5AA8 ,
16#20E7 , 16#56AF , 16#CC77 , 16#BA3F , 16#38E9 , 16#4EA1 , 16#D479 , 16# A231 , 16#D87E , 16# AE36 ,
16#34EE , 16#42A6 , 16#08F5 , 16#7EBD , 16#E465 , 16#922D , 16#E862 , 16#9E2A , 16#04F2 , 16#72BA ,
16#F06C , 16#8624 , 16#1CFC , 16#6AB4 , 16#10FB , 16#66B3 , 16#FC6B , 16#8A23 , 16#D19A , 16# A7D2 ,
16#3D0A , 16#4B42 , 16#310D , 16#4745 , 16#DD9D , 16# ABD5 , 16#2903 , 16#5F4B , 16#C593 , 16#B3DB ,
16#C994 , 16#BFDC , 16#2504 , 16#534C , 16#191F , 16#6F57 , 16#F58F , 16#83C7 , 16#F988 , 16#8FC0 ,
16#1518 , 16#6350 , 16#E186 , 16#97CE , 16#0D16 , 16#7B5E , 16#0111 , 16#7759 , 16#ED81 , 16#9BC9 ,
16#7927 , 16#0F6F , 16#95B7 , 16#E3FF , 16#99B0 , 16#EFF8 , 16#7520 , 16#0368 , 16#81BE , 16#F7F6 ,
16#6D2E , 16#1B66 , 16#6129 , 16#1761 , 16#8DB9 , 16#FBF1 , 16#B1A2 , 16#C7EA , 16#5D32 , 16#2B7A ,
16#5135 , 16#277D , 16#BDA5 , 16#CBED , 16#493B , 16#3F73 , 16# A5AB , 16#D3E3 , 16# A9AC , 16#DFE4 ,
16#453C , 16#3374 , 16#B957 , 16#CF1F , 16#55C7 , 16#238F , 16#59C0 , 16#2F88 , 16#B550 , 16#C318 ,
16#41CE , 16#3786 , 16# AD5E , 16#DB16 , 16# A159 , 16#D711 , 16#4DC9 , 16#3B81 , 16#71D2 , 16#079A ,
16#9D42 , 16#EB0A , 16#9145 , 16#E70D , 16#7DD5 , 16#0B9D , 16#894B , 16#FF03 , 16#65DB , 16#1393 ,
16#69DC , 16#1F94 , 16#854C , 16#F304 , 16#11EA , 16#67A2 , 16#FD7A , 16#8B32 , 16#F17D , 16#8735 ,
16#1DED , 16#6BA5 , 16#E973 , 16#9F3B , 16#05E3 , 16#73AB , 16#09E4 , 16#7FAC , 16#E574 , 16#933C ,
16#D96F , 16# AF27 , 16#35FF , 16#43B7 , 16#39F8 , 16#4FB0 , 16#D568 , 16# A320 , 16#21F6 , 16#57BE ,
16#CD66 , 16#BB2E , 16#C161 , 16#B729 , 16#2DF1 , 16#5BB9 ;


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2017-8-16
在线时间
60 小时
 楼主| 发表于 2021-4-9 08:49:47 | 显示全部楼层
  1. UINT8 CalcCrc (SAFETY_PDU* psPacket , UINT16 startCrc , UINT16* seqNo , UINT16 oldCrc , UINT8 bRcvDir ,UINT8 size)
  2. {
  3.         UINT8 bSuccess = false ;
  4.         UINT16 w1 , w2 ;
  5.         // temporaryvalues
  6.         UINT16 crc ;
  7.         UINT16 crc_common ;
  8.         // commonpartof CRCcalculation ,
  9.         // includes CRC_0 , Conn-ID , Sequence-No. , Cmd
  10.         UINT8* pCrc = &psPacket->au8Data [2]; // pointerto CRC Low-Byte
  11.         UINT8* pSafeData;
  12.         // pointerto SafeData Low-Byte
  13.         if (size > 6)
  14.         // that means2 ora multipleoftwosafetydata
  15.                 pCrc++ ;
  16.         // →Crc0 Low-Byteat Byteoffset3insteadof2
  17.         do
  18.         {
  19.                 crc = 0 ;
  20.                 // reset crc
  21.                 // Sequence for calcultaion :
  22.                 // old CRC-Lo , old CRC-Hi , ConnId-Lo , ConnId-Hi , SeqNo-Lo , SeqNo-Hi , Command ,
  23.                 // (Index ,) Data
  24.                 // CRC-Lo
  25.                 w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  26.                 // lookatthe CRC-table
  27.                 w2 = aCrcTab2 [((UINT8*) &startCrc)[0]];
  28.                 // lookatthe CRC-table
  29.                 w1 = w1 ^ w2 ;
  30.                 ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  31.                 ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  32.                 // CRC-Hi
  33.                 w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  34.                 w2 = aCrcTab2 [((UINT8*) &startCrc)[1]];
  35.                 w1 = w1 ^ w2 ;
  36.                 ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  37.                 ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  38.                 // ConnId-Lo
  39.                 w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  40.                 w2 = aCrcTab2 [psPacket->au8Data [size-2]];
  41.                 w1 = w1 ^ w2 ;
  42.                 ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  43.                 ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  44.                 // ConnId-Hi
  45.                 w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  46.                 w2 = aCrcTab2 [psPacket->au8Data [size-1]];
  47.                 w1 = w1 ^ w2 ;
  48.                 ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  49.                 ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  50.                 // SeqNo-Lo
  51.                 w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  52.                 w2 = aCrcTab2 [((UINT8*) seqNo)[LO_BYTE]];
  53.                 w1 = w1 ^ w2 ;
  54.                 ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  55.                 ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  56.                 // SeqNo-Hi
  57.                 w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  58.                 w2 = aCrcTab2 [((UINT8*) seqNo)[HI_BYTE]];
  59.                 w1 = w1 ^ w2 ;
  60.                 ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  61.                 ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  62.                 // Command
  63.                 w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  64.                 w2 = aCrcTab2 [psPacket->au8Data [OFFS_COMMAND]];
  65.                 w1 = w1 ^ w2 ;
  66.                 ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  67.                 ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  68.                 // CRCpartthatiscommonforallothercrc-calculationsissaved
  69.                 crc_common=crc ;
  70.                 // Data [0]
  71.                 w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  72.                 w2 = aCrcTab2 [psPacket->au8Data [OFFS_DATA]];
  73.                 w1 = w1 ^ w2 ;
  74.                 ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  75.                 ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  76.                 // if2 Byte Safetydata→calculatenext Byteintothecrc
  77.                 if (size > 6)
  78.                 {
  79.                         // Data [1]
  80.                         w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  81.                         w2 = aCrcTab2 [psPacket->au8Data [OFFS_DATA+1]];
  82.                         w1 = w1 ^ w2 ;
  83.                         ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  84.                         ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  85.                 }
  86.                 // UPDATE_SEQ_NO
  87.                 seqNo [0] ++ ;
  88.                 if (seqNo [0] == 0)
  89.                 seqNo [0] ++ ;
  90.         } while (crc == oldCrc && (bRcvDir & NEW_CRC) != 0) ;
  91.         // aslongasresultingcrcisthesamelikeoldCrc
  92.         if (bRcvDir)
  93.         // for receive direction
  94.         {
  95.                 if (((UINT8*) &crc)[HI_BYTE] == pCrc [OFFS_CRC_HI-OFFS_CRC_LO]
  96.                 && ((UINT8*) &crc)[LO_BYTE] == pCrc [0])
  97.                 {
  98.                         // for receive direction
  99.                         // CRC is correct
  100.                         bSuccess=true ;
  101.                 }
  102.         }
  103.         else
  104.         // for send direction
  105.         {
  106.                 // insert Checksum
  107.                 pCrc [OFFS_CRC_HI-OFFS_CRC_LO] = ((UINT8*)&crc)[HI_BYTE];
  108.                 pCrc [0] = ((UINT8*)&crc)[LO_BYTE];
  109.         }
  110.         // if more than 2 Byte Safety Data a retransferred ,
  111.         // CRC_1 and so forth must be calculated
  112.         if (size > 10)
  113.         {
  114.                 UINT16 i = 1 ;
  115.                 pSafeData = pCrc+2 ;
  116.                 // setpSafeDatatothe SafeData Low-Byte
  117.                 // ofthenextpart=SafeData [2]
  118.                 pCrc += 4 ;
  119.                 // setpCrcto CRC_i Low-Byte
  120.                 size-= 7 ;
  121.                 // substractfirstpartoftheframe
  122.                 while (size >=4)
  123.                 // aslongasotherpartsfollow
  124.                 {
  125.                         // Start-CRC
  126.                         crc = crc_common ;
  127.                         // this partisalreadycalculatedabove
  128.                         // i (Bit0-7)
  129.                         // calculateindex
  130.                         w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  131.                         w2 = aCrcTab2 [((UINT8*) &i)[LO_BYTE]];
  132.                         w1 = w1 ^ w2 ;
  133.                         ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  134.                         ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  135.                         // i (Bit8-15)
  136.                         w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  137.                         w2 = aCrcTab2 [((UINT8*) &i)[HI_BYTE]];
  138.                         w1 = w1 ^ w2 ;
  139.                         ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  140.                         ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  141.                         // Data2*i
  142.                         w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  143.                         w2 = aCrcTab2 [pSafeData [0]];
  144.                         w1 = w1 ^ w2 ;
  145.                         ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  146.                         ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  147.                         // Data2*i+1
  148.                         w1 = aCrcTab1 [((UINT8*) &crc)[HI_BYTE]];
  149.                         w2 = aCrcTab2 [pSafeData [1]];
  150.                         w1 = w1 ^ w2 ;
  151.                         ((UINT8*) &crc)[HI_BYTE] = ((UINT8*) &w1)[HI_BYTE] ^ ((UINT8*)&crc)[LO_BYTE];
  152.                         ((UINT8*) &crc)[LO_BYTE] = ((UINT8*) &w1)[LO_BYTE];
  153.                         if (((UINT8*) &crc)[HI_BYTE] == pCrc [1]&& ((UINT8*) &crc)[LO_BYTE] == pCrc [0])
  154.                         {
  155.                                 // CRCiscorrect
  156.                         }
  157.                         else
  158.                         {
  159.                                 bSuccess=false ;
  160.                                 if (bRcvDir == 0)
  161.                                 // forsenddirection
  162.                                 {
  163.                                         // insert Checksum
  164.                                         pCrc [1] = ((UINT8*)
  165.                                         &crc)[HI_BYTE];
  166.                                         pCrc [0] = ((UINT8*)
  167.                                         &crc)[LO_BYTE];                                               
  168.                                 }
  169.                         }
  170.                         size
  171.                         -=4 ;
  172.                         // substractthis partoftheframe
  173.                         pSafeData += 4 ;
  174.                         // setto nextSafeData Low Byte
  175.                         pCrc += 4 ;
  176.                         // setto next CRC_i Low Byte
  177.                         i++ ;
  178.                         // incrementIndex
  179.                 }
  180.         }
  181.         return bSuccess ;
  182. }
  183. [code]UINT16 aCrcTab1[266] ={
  184. 0x0000 , 0x39B7 , 0x736E , 0x4AD9 , 0xE6DC , 0xDF6B , 0x95B2 , 0xAC05 , 0xF40F , 0xCDB8 ,
  185. 0x8761 , 0xBED6 , 0x12D3 , 0x2B64 , 0x61BD , 0x580A , 0xD1A9 , 0xE81E , 0xA2C7 , 0x9B70 ,
  186. 0x3775 , 0x0EC2 , 0x441B , 0x7DAC , 0x25A6 , 0x1C11 , 0x56C8 , 0x6F7F , 0xC37A , 0xFACD ,
  187. 0xB014 , 0x89A3 , 0x9AE5 , 0xA352 , 0xE98B , 0xD03C , 0x7C39 , 0x458E , 0x0F57 , 0x36E0 ,
  188. 0x6EEA , 0x575D , 0x1D84 , 0x2433 , 0x8836 , 0xB181 , 0xFB58 , 0xC2EF , 0x4B4C , 0x72FB ,
  189. 0x3822 , 0x0195 , 0xAD90 , 0x9427 , 0xDEFE , 0xE749 , 0xBF43 , 0x86F4 , 0xCC2D , 0xF59A ,
  190. 0x599F , 0x6028 , 0x2AF1 , 0x1346 , 0x0C7D , 0x35CA , 0x7F13 , 0x46A4 , 0xEAA1 , 0xD316 ,
  191. 0x99CF , 0xA078 , 0xF872 , 0xC1C5 , 0x8B1C , 0xB2AB , 0x1EAE , 0x2719 , 0x6DC0 , 0x5477 ,
  192. 0xDDD4 , 0xE463 , 0xAEBA , 0x970D , 0x3B08 , 0x02BF , 0x4866 , 0x71D1 , 0x29DB , 0x106C ,
  193. 0x5AB5 , 0x6302 , 0xCF07 , 0xF6B0 , 0xBC69 , 0x85DE , 0x9698 , 0xAF2F , 0xE5F6 , 0xDC41 ,
  194. 0x7044 , 0x49F3 , 0x032A , 0x3A9D , 0x6297 , 0x5B20 , 0x11F9 , 0x284E , 0x844B , 0xBDFC ,
  195. 0xF725 , 0xCE92 , 0x4731 , 0x7E86 , 0x345F , 0x0DE8 , 0xA1ED , 0x985A , 0xD283 , 0xEB34 ,
  196. 0xB33E , 0x8A89 , 0xC050 , 0xF9E7 , 0x55E2 , 0x6C55 , 0x268C , 0x1F3B , 0x18FA , 0x214D ,
  197. 0x6B94 , 0x5223 , 0xFE26 , 0xC791 , 0x8D48 , 0xB4FF , 0xECF5 , 0xD542 , 0x9F9B , 0xA62C ,
  198. 0x0A29 , 0x339E , 0x7947 , 0x40F0 , 0xC953 , 0xF0E4 , 0xBA3D , 0x838A , 0x2F8F , 0x1638 ,
  199. 0x5CE1 , 0x6556 , 0x3D5C , 0x04EB , 0x4E32 , 0x7785 , 0xDB80 , 0xE237 , 0xA8EE , 0x9159 ,
  200. 0x821F , 0xBBA8 , 0xF171 , 0xC8C6 , 0x64C3 , 0x5D74 , 0x17AD , 0x2E1A , 0x7610 , 0x4FA7 ,
  201. 0x057E , 0x3CC9 , 0x90CC , 0xA97B , 0xE3A2 , 0xDA15 , 0x53B6 , 0x6A01 , 0x20D8 , 0x196F ,
  202. 0xB56A , 0x8CDD , 0xC604 , 0xFFB3 , 0xA7B9 , 0x9E0E , 0xD4D7 , 0xED60 , 0x4165 , 0x78D2 ,
  203. 0x320B , 0x0BBC , 0x1487 , 0x2D30 , 0x67E9 , 0x5E5E , 0xF25B , 0xCBEC , 0x8135 , 0xB882 ,
  204. 0xE088 , 0xD93F , 0x93E6 , 0xAA51 , 0x0654 , 0x3FE3 , 0x753A , 0x4C8D , 0xC52E , 0xFC99 ,
  205. 0xB640 , 0x8FF7 , 0x23F2 , 0x1A45 , 0x509C , 0x692B , 0x3121 , 0x0896 , 0x424F , 0x7BF8 ,
  206. 0xD7FD , 0xEE4A , 0xA493 , 0x9D24 , 0x8E62 , 0xB7D5 , 0xFD0C , 0xC4BB , 0x68BE , 0x5109 ,
  207. 0x1BD0 , 0x2267 , 0x7A6D , 0x43DA , 0x0903 , 0x30B4 , 0x9CB1 , 0xA506 , 0xEFDF , 0xD668 ,
  208. 0x5FCB , 0x667C , 0x2CA5 , 0x1512 , 0xB917 , 0x80A0 , 0xCA79 , 0xF3CE , 0xABC4 , 0x9273 ,
  209. 0xD8AA , 0xE11D , 0x4D18 , 0x74AF , 0x3E76 , 0x07C1 };


  210. //aCrcTab2 : ARRAY [ 0..255 ] OF WORD : =
  211. UINT16 aCrcTab2[266] ={
  212. 0x0000 , 0x7648 , 0xEC90 , 0x9AD8 , 0xE097 , 0x96DF , 0x0C07 , 0x7A4F , 0xF899 , 0x8ED1 ,
  213. 0x1409 , 0x6241 , 0x180E , 0x6E46 , 0xF49E , 0x82D6 , 0xC885 , 0xBECD , 0x2415 , 0x525D ,
  214. 0x2812 , 0x5E5A , 0xC482 , 0xB2CA , 0x301C , 0x4654 , 0xDC8C , 0xAAC4 , 0xD08B , 0xA6C3 ,
  215. 0x3C1B , 0x4A53 , 0xA8BD , 0xDEF5 , 0x442D , 0x3265 , 0x482A , 0x3E62 , 0xA4BA , 0xD2F2 ,
  216. 0x5024 , 0x266C , 0xBCB4 , 0xCAFC , 0xB0B3 , 0xC6FB , 0x5C23 , 0x2A6B , 0x6038 , 0x1670 ,
  217. 0x8CA8 , 0xFAE0 , 0x80AF , 0xF6E7 , 0x6C3F , 0x1A77 , 0x98A1 , 0xEEE9 , 0x7431 , 0x0279 ,
  218. 0x7836 , 0x0E7E , 0x94A6 , 0xE2EE , 0x68CD , 0x1E85 , 0x845D , 0xF215 , 0x885A , 0xFE12 ,
  219. 0x64CA , 0x1282 , 0x9054 , 0xE61C , 0x7CC4 , 0x0A8C , 0x70C3 , 0x068B , 0x9C53 , 0xEA1B ,
  220. 0xA048 , 0xD600 , 0x4CD8 , 0x3A90 , 0x40DF , 0x3697 , 0xAC4F , 0xDA07 , 0x58D1 , 0x2E99 ,
  221. 0xB441 , 0xC209 , 0xB846 , 0xCE0E , 0x54D6 , 0x229E , 0xC070 , 0xB638 , 0x2CE0 , 0x5AA8 ,
  222. 0x20E7 , 0x56AF , 0xCC77 , 0xBA3F , 0x38E9 , 0x4EA1 , 0xD479 , 0xA231 , 0xD87E , 0xAE36 ,
  223. 0x34EE , 0x42A6 , 0x08F5 , 0x7EBD , 0xE465 , 0x922D , 0xE862 , 0x9E2A , 0x04F2 , 0x72BA ,
  224. 0xF06C , 0x8624 , 0x1CFC , 0x6AB4 , 0x10FB , 0x66B3 , 0xFC6B , 0x8A23 , 0xD19A , 0xA7D2 ,
  225. 0x3D0A , 0x4B42 , 0x310D , 0x4745 , 0xDD9D , 0xABD5 , 0x2903 , 0x5F4B , 0xC593 , 0xB3DB ,
  226. 0xC994 , 0xBFDC , 0x2504 , 0x534C , 0x191F , 0x6F57 , 0xF58F , 0x83C7 , 0xF988 , 0x8FC0 ,
  227. 0x1518 , 0x6350 , 0xE186 , 0x97CE , 0x0D16 , 0x7B5E , 0x0111 , 0x7759 , 0xED81 , 0x9BC9 ,
  228. 0x7927 , 0x0F6F , 0x95B7 , 0xE3FF , 0x99B0 , 0xEFF8 , 0x7520 , 0x0368 , 0x81BE , 0xF7F6 ,
  229. 0x6D2E , 0x1B66 , 0x6129 , 0x1761 , 0x8DB9 , 0xFBF1 , 0xB1A2 , 0xC7EA , 0x5D32 , 0x2B7A ,
  230. 0x5135 , 0x277D , 0xBDA5 , 0xCBED , 0x493B , 0x3F73 , 0xA5AB , 0xD3E3 , 0xA9AC , 0xDFE4 ,
  231. 0x453C , 0x3374 , 0xB957 , 0xCF1F , 0x55C7 , 0x238F , 0x59C0 , 0x2F88 , 0xB550 , 0xC318 ,
  232. 0x41CE , 0x3786 , 0xAD5E , 0xDB16 , 0xA159 , 0xD711 , 0x4DC9 , 0x3B81 , 0x71D2 , 0x079A ,
  233. 0x9D42 , 0xEB0A , 0x9145 , 0xE70D , 0x7DD5 , 0x0B9D , 0x894B , 0xFF03 , 0x65DB , 0x1393 ,
  234. 0x69DC , 0x1F94 , 0x854C , 0xF304 , 0x11EA , 0x67A2 , 0xFD7A , 0x8B32 , 0xF17D , 0x8735 ,
  235. 0x1DED , 0x6BA5 , 0xE973 , 0x9F3B , 0x05E3 , 0x73AB , 0x09E4 , 0x7FAC , 0xE574 , 0x933C ,
  236. 0xD96F , 0xAF27 , 0x35FF , 0x43B7 , 0x39F8 , 0x4FB0 , 0xD568 , 0xA320 , 0x21F6 , 0x57BE ,
  237. 0xCD66 , 0xBB2E , 0xC161 , 0xB729 , 0x2DF1 , 0x5BB9 };
复制代码
[/code]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-19 07:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表