C# CRC-16 基于Modbus 校验码计算代码 在线等在线等~~~~

jyw555785 2016-07-16 09:27:12
最近在做一个基于Modbus的串口数据,现在有一串数据需要计算出CRC16校验码如下图:


实在是没有做过,急求C#代码,最好含有注释,我能自己去学习!
...全文
1119 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
System.IO.Ports 2017-06-12
  • 打赏
  • 举报
回复
试一试这个 http://www.cnblogs.com/oukunqing/p/5820640.html
by_封爱 版主 2017-03-20
  • 打赏
  • 举报
回复
你都说了基于modbus的协议了..为什么还要自己算, 第三方modbus.dll直接根据地址读取 无需关心校验...
Theflybird 2016-07-19
  • 打赏
  • 举报
回复
http://blog.csdn.net/qsycn/article/details/5430886
拜一刀 2016-07-19
  • 打赏
  • 举报
回复
http://www.cnblogs.com/armyfai/p/3566582.html 代码随便百度下就有(至少c#还是比较好找的),主要问题是两端的crc要一致
yinkuiwu 2016-07-19
  • 打赏
  • 举报
回复
按照你要求的实现

/// <summary>
        /// 将字节数组进行CRC16验证,多项式:A001
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static byte[] CRC16_2(byte[] data) {
            byte[] returnVal = new byte[2];
            byte CRC16Lo, CRC16Hi, CL, CH, SaveHi, SaveLo;
            int i, Flag;
            CRC16Lo = 0xFF;
            CRC16Hi = 0xFF;

            CL = 0x01;
            CH = 0xA0;

            for (i = 0; i < data.Length; i++) {
                CRC16Hi = (byte)(CRC16Hi ^ data[i]);//每一个数据与CRC寄存器进行异或
                for (Flag = 0; Flag <= 7; Flag++) {
                    SaveHi = CRC16Hi;
                    SaveLo = CRC16Lo;
                    CRC16Hi = (byte)(CRC16Hi >> 1);//高位右移一位
                    CRC16Lo = (byte)(CRC16Lo >> 1);//低位右移一位
                    if ((SaveHi & 0x01) == 0x01)//如果高位字节最后一位为1
                    {
                        CRC16Lo = (byte)(CRC16Lo | 0x80);//则低位字节右移后前面补1 否则自动补0
                    }
                    if ((SaveLo & 0x01) == 0x01)//如果LSB为1,则与多项式码进行异或
                    {
                        CRC16Hi = (byte)(CRC16Hi ^ CH);
                        CRC16Lo = (byte)(CRC16Lo ^ CL);
                    }
                }
            }
            returnVal[1] = CRC16Hi;//CRC高位
            returnVal[0] = CRC16Lo;//CRC低位
            return returnVal;
        }
jyw555785 2016-07-16
  • 打赏
  • 举报
回复
这个是算法步骤,不知道怎么实现C#代码....完全没思路 1.置16位寄存器为全1,作为CRC寄存器。 2.把一个8位数据与16位CRC寄存器的低字节相异或 ,把结果放于CRC寄存器中。 3.把寄存器的内容右移一位(朝低位),用0填补最 高位,检查最低位(移出位)。 4.如果最低位为0,重复2.3(再移位);如果最低位 为1,CRC寄存器与多项式A001H(1010 0000 0000 0001 )进行异或。 5.重复2.3、2.4,直到右移8次,这样整个8位数据全 部进行了处理。 6.重复2.2-2.5,进行下一个8位数据的处理。 7.将一帧的所有数据字节处理完后得到CRC-16寄存器 。 8.将CRC-16寄存器的低字节和高字节交换,得到的值 即为CRC-16码。
jyw555785 2016-07-16
  • 打赏
  • 举报
回复
都在睡觉么~坐等大神~
jyw555785 2016-07-16
  • 打赏
  • 举报
回复
引用 3 楼 u012830772 的回复:
算法你自己不都写出来了么?对于c来说就是通过指针操作每个数据,C#就是foreach。定义word CRC_16 保存CRC校验码(就是你说的寄存器),foreach获得每个字节,每个字节按算法操作,算法里面就是逻辑运算,有些条件跳转的不好写就用goto先用着
确实没做过这一类的,所以有算法,没思路,完全是懵的.........
wangyu0517 2016-07-16
  • 打赏
  • 举报
回复
算法你自己不都写出来了么?对于c来说就是通过指针操作每个数据,C#就是foreach。定义word CRC_16 保存CRC校验码(就是你说的寄存器),foreach获得每个字节,每个字节按算法操作,算法里面就是逻辑运算,有些条件跳转的不好写就用goto先用着

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧