Modbus CRC 16 (C#)

本文详细介绍了CRC16校验算法的工作原理和实现过程,包括预置寄存器、异或操作、右移位及多项式码的使用。通过具体步骤说明了如何处理通信消息帧中的每个字节,并提供了C#代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法

1.预置一个值为 0xFFFF 的 16 位寄存器,此寄存器为 CRC 寄存器。
2.把第 1 个 8 位二进制数据(即通信消息帧的第 1 个字节)与 16 位的 CRC 寄存器相异或,异或的结果仍存放在该 CRC 寄存器中。
3.把 CRC 寄存器的内容右移一位,用 0 填补最高位,并检测移出位是 0 还是 1.
4.如果移出位为0 ,则重复步骤(3)(再次右移一位);如果移出位为 1,则 CRC 寄存器与 0xA001 (多项式码)进行异或。
5.重复步骤(3)和(4),直到右移 8 次,这样整个 8 位数据全部进行了处理。
6.重复步骤(2)~(5),进行消息帧下一个字节的处理。
7.将该通信消息帧所有字节按上述步骤计算完成后,得到的 16 位 CRC 寄存器的高、低位进行交换。即发送时首先添加低位字节,然后添加高位字节。
8.最后得到的 CRC 寄存器内容即为CRC 校验码。

代码

public static byte[] GetModbusCrc16(byte[] bytes)
{
    byte crcRegister_H = 0xFF, crcRegister_L = 0xFF;// 预置一个值为 0xFFFF 的 16 位寄存器

    byte polynomialCode_H = 0xA0, polynomialCode_L = 0x01;// 多项式码 0xA001

    for (int i = 0; i < bytes.Length; i++)
    {
        crcRegister_L = (byte)(crcRegister_L ^ bytes[i]);

        for (int j = 0; j < 8; j++)
        {
            byte tempCRC_H = crcRegister_H;
            byte tempCRC_L = crcRegister_L;

            crcRegister_H = (byte)(crcRegister_H >> 1);
            crcRegister_L = (byte)(crcRegister_L >> 1);
            // 高位右移前最后 1 位应该是低位右移后的第 1 位:如果高位最后一位为 1 则低位右移后前面补 1
            if ((tempCRC_H & 0x01) == 0x01)
            {
                crcRegister_L = (byte)(crcRegister_L | 0x80);
            }

            if ((tempCRC_L & 0x01) == 0x01)
            {
                crcRegister_H = (byte)(crcRegister_H ^ polynomialCode_H);
                crcRegister_L = (byte)(crcRegister_L ^ polynomialCode_L);
            }
        }
    }

    return new byte[] { crcRegister_L, crcRegister_H };
}

代码地址:ModbusCrc16

转载于:https://www.cnblogs.com/victorbu/p/10393061.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值