日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Modbus crc16校验

發布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Modbus crc16校验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CRC-16 / MODBUS :

1)CRC寄存器初始值為 FFFF;即16位全為1;

2)CRC-16 / MODBUS的多項式A001H (1010 0000 0000 0001B) ‘H’表示16進制數,‘B’表示二進制數

計算步驟為:
(1).預置 16 位寄存器為十六進制 FFFF(即全為 1) ,稱此寄存器為 CRC 寄存器;
(2).把第一個 8 位數據與 16 位 CRC 寄存器的低位相異或,把結果放于 CRC 寄
存器;

(3).檢測相異或后的CRC寄存器的最低位,若最低位為1:CRC寄存器先右移1位,再與多項式A001H進行異或;若為0,則CRC寄存器右移1位,無需與多項式進行異或。

(4).重復步驟 3 ,直到右移 8 次,這樣整個 8 位數據全部進行了處理;
(5).重復步驟 2 到步驟4,進行下一個 8 位數據的處理;
(6).最后得到的 CRC 寄存器即為 CRC 碼。

補充:
多項式產生:
如x16+x12+x5+1
x16表示第16位為1,x5表示第5位為1
(1 << 16) | (1 << 12) | (1 << 5) | (1) = 0x11021
但是CRC16只取低16位,寫成16進制數就是 0x1021

// Modbus crc16 unsigned short crc16 ( unsigned char *Array, unsigned int Len ) {unsigned int IX, IY, CRC;unsigned char Rcvbuf[2] = { 0 };if ( Len <= 0 )return 0;CRC = 0xFFFF;for ( IX = 0; IX < Len; IX++ ) //需要處理的數據{CRC = CRC ^ ( unsigned int ) ( Array[IX] );for ( IY = 0; IY <= 7; IY++ ) // 處理1個字節{if ( ( CRC & 1 ) != 0 )CRC = ( CRC >> 1 ) ^ 0xA001;elseCRC = CRC >> 1; }}Rcvbuf[0] = ( CRC & 0xff00 ) >> 8; //高位Rcvbuf[1] = ( CRC & 0x00ff ); //低位CRC = Rcvbuf[0] << 8;CRC += Rcvbuf[1];return CRC; }

參考:https://blog.csdn.net/u013625451/article/details/81239572?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6.pc_relevant_default

總結

以上是生活随笔為你收集整理的Modbus crc16校验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。