Modbus協議中RTU模式中的CRC校驗及c語言實現

CRC 校驗

由於最近要控制一個伺服電機,用到了串口modbus協議,用到的是rtu模式。協議也是起始幀加數據幀加CRC校驗。特此係統記錄一下crc校驗。

CRC概念

首先crc就是一個附在一串報文後面的一個16位二進制的數,由發送設備計算。接受的設備在接收報文後重新計算CRC,然後把這個值和接收到的CRC數據進行對比,如果兩個值相等·就校驗成功,若兩個值不相等,則爲錯誤。

CRC計算方式

CRC的計算,首先對一個16位寄存器預裝全1,然後將報文中連續的8位子節對其進行後續的計算。起始位停止位一般不參與CRC計算。
1: 把一個16位寄存器全部裝入1,FFFF將這個寄存器稱爲CRC寄存器。
2: 把報文的第一個八位字節和16位CRC寄存器低字節異或,結果置於CRC寄存器。
3:把CRC寄存器右移一位,MSB充零(最高有效位),提取並檢測LSB。
4:如果LSB(最低位)是0則繼續第三步,如果是1則對CRC寄存器.
5: 重複3和4兩個步驟,直到完成8次移位。
6:對報文中2-5步驟重複,直到所有報文被處理。
7: CRC寄存器中生成最終的CRC校驗碼
8:當CRC值放在報文中的時候高低字節必須交換位置。在這裏插入圖片描述

c語言實現CRC校驗實例

unsigned char *data;
unsigned char length;
unsigned int crc_chk(unsigned char *data,unsigned char length)
{
 int i,j;
 unsigned int crc_reg =0xffff;
 while(length--)
 {
   crc_reg^=*data++;
   for(j=0;j<8;j++)
   {
   if(crc_reg&0x01)
    {
     crc_reg=(crc_reg>>1)^0xa001;
    }
    else
    {
    crc_reg=crc_reg>>1;
    }
    
   }
 }
 return crc_reg;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章