·
//计算循环校验码 (子程序)
void CalcCrc(BYTE CrcBuf, WORD *pCrc)
{
WORD g_uCode;
*pCrc = *pCrc ^ CrcBuf;
for(int g_Counter1 = 0; g_Counter1 < 8; g_Counter1++ )
{
g_uCode = *pCrc & 1;
*pCrc = *pCrc >> 1;
*pCrc = *pCrc & 0x7fff;
if( g_uCode == 1 )
*pCrc = *pCrc ^ 0xa001;
*pCrc = *pCrc & 0xffff;
}
}
WORD CRC16(BYTE *pText, UINT DataLen)
{
WORD m_wRtn = 0xffff;
for(int g_Counter = 0; g_Counter < (int)DataLen; g_Counter++ )
CalcCrc( pText[g_Counter], &m_wRtn );
return m_wRtn;
}
使用:
WORD crc16=CRC16(sendBuff,6);
sendBuff[6]=crc16&0x00FF;
sendBuff[7]=crc16>>8;