Modbus-RTU通訊協議中CRC校驗碼的計算步驟及C算法代碼


在CRC計算時只用8個數據位,起始位及停止位,如有奇偶校驗位也包括奇偶校驗位,都不參與CRC計算。

CRC計算方法是:

1、 預置1個16位的寄存器為十六進制FFFF(全1),此寄存器為CRC寄存器

unsigned short wcrc = 0xFFFF;					//16位CRC寄存器預置 

2、 把第一個8位二進制數據(即通訊信息幀的第一個字節)與16位的CRC寄存器的低八位相異或,把結果存放於CRC寄存器。

temp = *buffer & 0x00FF;					//將八位數據與crc寄存器亦或
buffer++;								//指針地址增加,指向下個數據
wcrc ^= temp;							//將數據存入crc寄存器

3、 把CRC寄存器的內容右移一位(朝低位)用0填補最高位,並檢測右移后的移出位。

4、 如果移出位為零,則重復第三步(再次右移一位);如果移出位為1,CRC寄存器與多項式A001進行異或。

5、 重復步驟3和4,直到右移8次,這樣整個8位數據全部進行了處理。

		for (j = 0; j < 8; j++)						//循環計算數據的
		{
			if (wcrc & 0x0001)						//判斷右移出的是不是1,如果是1則與多項式進行異或。
			{
				wcrc >>= 1;							//先將數據右移一位
				wcrc ^= 0xA001;						//與上面的多項式進行異或
			}
			else									//如果不是1,則直接移除
			{
				wcrc >>= 1;							//直接移除
			}
		}

6、 重復步驟2和5,進行通訊信息幀下一個字節的處理。

7、 將該通訊信息幀所有字節按上述步驟計算完成后,得到的16位CRC寄存器的高、低字節進行交換

8、 最后得到的CRC寄存器內容即為:CRC校驗碼。

附完整代碼如下:

#include<stdio.H>
#include<stdlib.H>

unsigned short GetCRCData(unsigned char *buffer,unsigned len)
{
	unsigned short wcrc = 0xFFFF;					//16位CRC寄存器預置
	unsigned char temp;
	unsigned i = 0, j = 0;						//計數
	for (i = 0; i < len; i++)						//循環計算每個數據
	{
		temp = *buffer & 0x00FF;					//將八位數據與crc寄存器亦或
		buffer++;									//指針地址增加,指向下個數據
		wcrc ^= temp;								//將數據存入crc寄存器
		for (j = 0; j < 8; j++)						//循環計算數據的
		{
			if (wcrc & 0x0001)						//判斷右移出的是不是1,如果是1則與多項式進行異或。
			{
				wcrc >>= 1;							//先將數據右移一位
				wcrc ^= 0xA001;						//與上面的多項式進行異或
			}
			else									//如果不是1,則直接移除
			{
				wcrc >>= 1;							//直接移除
			}
		}
	}
	unsigned char CRC_L,CRC_H;						//定義數據高低位
	CRC_L = wcrc & 0xFF;							//CRC的低8位
	CRC_H = wcrc >> 8;								//CRC的高8位

	return((CRC_L << 8) | CRC_H);
}

int main(void)
{
	unsigned short crc;
	unsigned char buffer[6];

	buffer[0] = 0x01;
	buffer[1] = 0x06;
	buffer[2] = 0x01;
	buffer[3] = 0x00;
	buffer[4] = 0x00;
	buffer[5] = 0x02;

	crc = GetCRCData(&buffer[0], 6);

	printf("%X\n",crc);

	getchar();
}

感謝有幫助的小伙伴轉走。


 

持之以恆的學習是人類進步的階梯  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM