Modbus.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include "Modbus.h"
  2. void InvertUint8(unsigned char *dBuf, unsigned char *srcBuf)
  3. {
  4. int i;
  5. unsigned char tmp[4];
  6. tmp[0] = 0;
  7. for(i = 0; i < 8; i++)
  8. {
  9. if(srcBuf[0] & (1 << i))
  10. tmp[0] |= 1 << (7 - i);
  11. }
  12. dBuf[0] = tmp[0];
  13. }
  14. void InvertUint16(unsigned short *dBuf, unsigned short *srcBuf)
  15. {
  16. int i;
  17. unsigned short tmp[4];
  18. tmp[0] = 0;
  19. for (i = 0; i < 16; i++)
  20. {
  21. if(srcBuf[0] & (1 << i))
  22. tmp[0] |= 1 << (15 - i);
  23. }
  24. dBuf[0] = tmp[0];
  25. }
  26. unsigned short CRC16_MODBUS(unsigned char *puchMsg, unsigned int usDataLen)
  27. {
  28. int i;
  29. unsigned short temp;
  30. unsigned short temp1;
  31. unsigned short wCRCin = 0xFFFF;
  32. unsigned short wCPoly = 0x8005;
  33. unsigned char wChar = 0;
  34. while(usDataLen--)
  35. {
  36. wChar = *(puchMsg++);
  37. InvertUint8(&wChar, &wChar);
  38. wCRCin ^= (wChar << 8);
  39. for(i = 0; i < 8; i++)
  40. {
  41. if(wCRCin & 0x8000)
  42. wCRCin = (wCRCin << 1)^wCPoly;
  43. else
  44. wCRCin = wCRCin << 1;
  45. }
  46. }
  47. InvertUint16(&wCRCin, &wCRCin);
  48. temp1=wCRCin>>8&0x00ff;
  49. temp=(temp1)+(wCRCin<<8);
  50. return(temp);
  51. }