使用C#配合modbus协议的16进制代码生成crc16校验码的计算方法

前言

在网上也是查看了很多关于crc16校验的文章,但是好像都是对于有基础的人看的,我当时拿起直接使用,发现行不通,这对于零基础的不是很友好,所以决定贡献一篇,哈哈哈哈~~~

复制代码
public uint CalcCRC16(string hexCommand)
        {
            byte[] pBuf = HexStringToByteArray(hexCommand);
            uint i, j;
            uint crc16 = 0xFFFF;
            for (i = 0;i< pBuf.Length; i++)
            {
                crc16 ^= pBuf[i];
                for (j = 0;j<8; j++)
                {
                    if ((crc16 & 0x0001) != 0) 
                    {
                        crc16 >>= 1; // 右移一位
                        crc16 ^= 0xA001; // 异或多项式0xA001
                    }
                    else
                    {
                        crc16 >>= 1; // 右移一位
                    }
                }
            }
            return crc16;
        }

private byte[] HexStringToByteArray(string hexString)
        {
            hexString = hexString.Replace(" ", "").Replace("-", "").ToUpper().Trim();
            if (hexString.Length % 2 != 0)
            {
                hexString += " ";
            }
            int bytesCount = hexString.Length / 2;
            byte[] bytes = new byte[bytesCount];

            for (int i = 0; i < bytesCount; i++)
            {
                string byteString = hexString.Substring(i * 2, 2);
                bytes[i] = Convert.ToByte(byteString, 16);
            }

            return bytes;
        }
复制代码

下面就是使用环节:

string defSend = "0125546ACDF126";
//modbus是我将CalcCRC16这个方法封装在modbus这个对象的类中
uint crcDef = modbus.CalcCRC16(defSend);
//Low表示低位字节   High表示高位字节
//crcDefLow 和crcDefHigh 算出来的就是校验码
string crcDefLow = Convert.ToString((byte)(crcDef & 0xFF), 16);
string crcDefHigh = Convert.ToString((byte)(crcDef >> 8), 16);                

 

posted @   山中修炼十余载  阅读(1880)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示