互动
最近评论
标签
寻找感兴趣的领域

MODOBUS RTU协议参考代码

#include <stdio.h>

#include <stdint.h>

#include <stdlib.h>

uint8_t g_test[8] = {0x01,0x06,0x00,0x02,0x40,0x40,0x00,0x00};

int crc16_modbus(uint8_t *data, uint8_t length);

int main(void){

  int flag = crc16_modbus(g_test, 8); // 直接传递 g_test,不需要取地址

  for (int i = 0; i < 8; i++) {

​    printf("g_test[%d] = 0x%02X\n", i, g_test[i]);

  }

  return 0;

}

int crc16_modbus(uint8_t *data, uint8_t length)

{

  int detection = 0;

  if ((data[length-2] == 0) && (data[length-1] == 0))

  {

//     printf("CRC detection!\n");

​    detection = 1;

​    length -= 2;

  }

  uint16_t uCRC = 0xFFFF;       /* 初始值为0xFFFF */

  for(uint8_t num = 0; num < length; num++)

  {

​    uCRC = (data[num]) ^ uCRC;    /* 把数据与16位的CRC寄存器的低8位相异或,结果存放于CRC寄存器。 */

​    for(uint8_t x = 0; x < 8; x++)  /* 循环8次 */

​    {

​      if(uCRC & 0x0001)      /*判断最低位为:“1” */

​      {

​        uCRC = uCRC >> 1;    /* 先右移 */

​        uCRC = uCRC ^ 0xA001;  /* 再与0xA001异或 */

​      }

​      else             /* 判断最低位为:“0” */

​      {

​        uCRC = uCRC >>1 ;    /* 右移 */

​      }

​    }

  }

  if (detection) {

​    data[length] = uCRC & 0x00FF;       /* 取出CRC校验结果的低八位 */

​    data[length+1] = (uCRC & 0xFF00) >> 8;   /* 取出CRC校验结果的高八位 */

  }

  return uCRC == 0;

}


评论
你无需删除空行,直接评论以获取最佳展示效果
引用到评论