Arduino如何计算Modbus RTU 校验值

这段代码定义了一个名为 modbus_crc16 的函数,该函数可以用于计算任何长度的数据的 Modbus RTU 校验值。可以将 senddata 数组作为参数传递给该函数,并在 setup 函数中调用该函数以计算其 CRC16 值。然后,通过位运算将该值分为高位和低位,并将其输出。

#include <stdint.h>

unsigned char senddata[2] = {0x01, 0x03};

uint16_t modbus_crc16(unsigned char *data, uint8_t length) {
  uint16_t crc = 0xFFFF;
  
  for (uint8_t i = 0; i < length; i++) {
    crc ^= data[i];
    for (uint8_t j = 8; j > 0; j--) {
      if (crc & 0x0001) {
        crc = (crc >> 1) ^ 0xA001;
      } else {
        crc >>= 1;
      }
    }
  }
  
  return crc;
}

void setup() {
  Serial.begin(9600);
  
  uint16_t crc = modbus_crc16(senddata, sizeof(senddata));
  Serial.print("CRC16: 0x");
  Serial.print((crc & 0xFF00) >> 8, HEX);
  Serial.print(", 0x");
  Serial.println(crc & 0x00FF, HEX);
  
  Serial.print("CRC16:");
  Serial.print((crc & 0xFF00) >> 8);
  Serial.print(",");
  Serial.println(crc & 0x00FF);  
}

void loop() {
  // Do nothing
}
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值