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