MODBUS CRC16

 1 //////////////////////////////////////////////////////////////////////////
 2 // CRC MODBUS 效验
 3 // 输入参数: pDataIn: 数据地址
 4 //           iLenIn: 数据长度           
 5 // 输出参数: pCRCOut: 2字节校验值 
 6 void CCRCDlg::CheckCRCModBus(const CHAR* pDataIn, int iLenIn, WORD* pCRCOut)
 7 {
 8     WORD wHi = 0;
 9     WORD wLo = 0;
10     WORD wCRC;
11     wCRC = 0xFFFF;
12 
13     for (int i = 0; i < iLenIn; i++)
14     {
15         wCRC = CalcCRCModBus(*pDataIn, wCRC);
16         pDataIn++;
17     }
18 
19     wHi = wCRC / 256;
20     wLo = wCRC % 256;    
21     wCRC = (wHi << 8) | wLo;
22 
23     *pCRCOut = wCRC;
24 }
25 
26 WORD CCRCDlg::CalcCRCModBus(CHAR cDataIn, WORD wCRCIn)
27 {
28     WORD wCheck = 0;
29     wCRCIn = wCRCIn ^ cDataIn;
30 
31     for(int i = 0; i < 8; i++)
32     {
33         wCheck = wCRCIn & 1;
34         wCRCIn = wCRCIn >> 1;
35         wCRCIn = wCRCIn & 0x7fff;
36 
37         if(wCheck == 1)
38         {
39             wCRCIn = wCRCIn ^ 0xa001;
40         }
41         wCRCIn = wCRCIn & 0xffff;
42     }
43 
44     return wCRCIn;
45 }

转自http://blog.csdn.net/lluct/article/details/2617967

原文地址:https://www.cnblogs.com/hujianhua/p/2549383.html