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