1.請問為什么要使用CRC16_MODBUS進行校驗 ?
2.或者說使用CRC16_MODBUS校驗有什么好處?
3.什么情況下使用CRC16_MODBUS校驗?
看了一些關于CRC16_MODBUS校驗的代碼但是還不是很能理解,求助知識分享
//CRC16_MODBUS:多項式x16+x15+x5+1(0x8005),初始值0xFFFF,低位在前,高位在后,結果與0x0000異或
void InvertUint8(unsigned char *dBuf,unsigned char *srcBuf)
{
int i;
unsigned char tmp[4];
tmp[0] = 0;
for(i=0;i< 8;i++)
{
if(srcBuf[0]& (1 << i))
tmp[0]|=1<<(7-i);
}
dBuf[0] = tmp[0];
}
void InvertUint16(unsigned short *dBuf,unsigned short *srcBuf)
{
int i;
unsigned short tmp[4];
tmp[0] = 0;
for(i=0;i< 16;i++)
{
if(srcBuf[0]& (1 << i))
tmp[0]|=1<<(15 - i);
}
dBuf[0] = tmp[0];
}
unsigned short CRC16_MODBUS(unsigned char *puchMsg, unsigned int usDataLen)
{
unsigned short wCRCin = 0xFFFF;
unsigned short wCPoly = 0x8005;
unsigned char wChar = 0;
while (usDataLen--)
{
wChar = *(puchMsg++);
InvertUint8(&wChar,&wChar);
wCRCin ^= (wChar << 8);
for(int i = 0;i < 8;i++)
{
if(wCRCin & 0x8000)
wCRCin = (wCRCin << 1) ^ wCPoly;
else
wCRCin = wCRCin << 1;
}
}
InvertUint16(&wCRCin,&wCRCin);
return (wCRCin) ;
}
uj5u.com熱心網友回復:
校驗是為了發現資料傳輸錯誤,為什么用CRC16,因為簡單、快速、易于硬體實作,以太網、PCIe底層都使用CRC16用于檢驗資料傳輸的正確性轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/267905.html
標籤:C語言
