12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- #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);
- }
|