單片機在傳輸modbus資料的時候需要進行crc校驗,本文介紹另一種校驗方法;
第一步 設定一個16位暫存器,例如為:jicun ;暫存器初始值為 0xFFFF,
第二步 CRC-16 / MODBUS的多項式為0xA001,
第三步 開始計算,把需要校驗的位元組與暫存器的低位相異或,結果仍存在暫存器;
例如: jicun = zijie1 ^ jicun
第四步:難點來了,注意此步分兩種情況,
A:判斷暫存器的最低位元位,如果為1:暫存器先右移1位,再與A001H進行異或,結果仍然存回jicun,
B: 暫存器的最低位元位,如果為0:暫存器只右移1位,結果仍然存回jicun,
好了如此重復8次,一個位元組校驗完畢;
第五步 把結果送達相關需要的地方;
#include "reg51.h"
unsigned char crchi; //存放校驗值的高位元組;
unsigned char crclo; //存放校驗的值低位元組;
unsigned char test[] ={0x5a,0x07,0xf0,0x0f,0xe7,0xff,0x00,0x00};
unsigned int result; //用于校驗的陣列,多兩位以便校驗以后把校驗數值填進去;
unsigned int crc16( unsigned char Len)
{
unsigned int temp = 0xffff;
unsigned char n,i;
for( n = 0; n < Len; n++) //此處的Len是要校驗的位元組數,
{
temp = test[n] ^ temp;
for( i = 0;i < 8;i++) //每一個位元組8bit,每bit都要處理,
{
if(temp & 0x01)
{
temp = temp >> 1;
temp = temp ^ 0xa001;
}
else
{
temp = temp >> 1;
}
}
}
return temp;
}
//以下為主函式;
void main()
{
while(1)
{
result=crc16( 6);
crclo=result;
crchi=result>>8;
test[6] =crclo;
test[7]=crchi;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282368.html
標籤:其他
