modbusCRC校验以及C语言实现

modbus crc检验原理

Modbus协议使用CRC(循环冗余校验)作为数据校验机制。 CRC是一种计算数据内容的摘要值并将其附加到数据末尾的技术。 在Modbus协议中,CRC是16位数字。 CRC校验可以保证数据的完整性和准确性。

CRC校验算法的过程如下:

  1. 首先将数据和CRC寄存器的值置为0。

  2. 对于每个字节,将其和CRC寄存器的最低8位进行异或运算。

  3. 对于每个位,如果CRC寄存器的最低位是1,则右移一位,然后与预定义的多项式0xA001进行异或运算。

  4. 重复步骤2和3,直到所有字节都处理完毕。

  5. 最终CRC寄存器的值即为校验和。

Modbus协议在每个通信帧的末尾都进行CRC校验。 接收方可以使用相同的算法来计算CRC并将其与接收到的CRC进行比较,以确保数据的完整性。如果两个CRC值不匹配,则接收方将拒绝数据。

c语言程序实现

下面是modbus CRC 校验的 C 语言程序:

#include <stdint.h>

// 生成CRC16表
void crc16_init(uint16_t *table)
{
    uint16_t crc;

    for (int i = 0; i < 256; ++i)
    {
        crc = i;
        for (int j = 0; j < 8; ++j)
        {
            if (crc & 0x0001)
            {
                crc = (crc >> 1) ^ 0xA001;
            }
            else
            {
                crc >>= 1;
            }
        }
        table[i] = crc;
    }
}

// 计算CRC16校验码
uint16_t crc16_calc(const uint8_t *buf, int len, const uint16_t *table)
{
    uint16_t crc = 0xFFFF;

    for (int i = 0; i < len; ++i)
    {
        crc = (crc >> 8) ^ table[(crc ^ buf[i]) & 0xFF];
    }

    return crc;
}

int main()
{
    uint16_t crc_table[256];
    crc16_init(crc_table);

    uint8_t buf[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
    uint16_t crc = crc16_calc(buf, sizeof(buf), crc_table);
    
    return 0;
}

在上述程序中,crc16_init() 函数用于生成 CRC16 表,crc16_calc() 函数用于计算缓存区的 CRC16 校验码。

【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值