#include "Modbus.h" void InvertUint8(unsigned char *dBuf, unsigned char *srcBuf) { int i; unsigned char tmp[4]; tmp[0] = 0; for(i = 0; i < 8; i++) { if(srcBuf[0] & (1 << i)) tmp[0] |= 1 << (7 - i); } dBuf[0] = tmp[0]; } void InvertUint16(unsigned short *dBuf, unsigned short *srcBuf) { int i; unsigned short tmp[4]; tmp[0] = 0; for (i = 0; i < 16; i++) { if(srcBuf[0] & (1 << i)) tmp[0] |= 1 << (15 - i); } dBuf[0] = tmp[0]; } unsigned short CRC16_MODBUS(unsigned char *puchMsg, unsigned int usDataLen) { int i; unsigned short temp; unsigned short temp1; unsigned short wCRCin = 0xFFFF; unsigned short wCPoly = 0x8005; unsigned char wChar = 0; while(usDataLen--) { wChar = *(puchMsg++); InvertUint8(&wChar, &wChar); wCRCin ^= (wChar << 8); for(i = 0; i < 8; i++) { if(wCRCin & 0x8000) wCRCin = (wCRCin << 1)^wCPoly; else wCRCin = wCRCin << 1; } } InvertUint16(&wCRCin, &wCRCin); temp1=wCRCin>>8&0x00ff; temp=(temp1)+(wCRCin<<8); return(temp); }