Modbus-crc16校验原理和方法(含测试代码以及演算过程)_modbus crc-程序员宅基地

技术标签: c语言  开源协议  单片机  

1.modbus基础知识

1.1什么是modbus

   1. Modbus是一种串行通信协议,最初由Modicon(目前属于施耐德电气公司)于1979年开发
   2. Modbus协议是应用在Modicon产品上的,后来才被移植到其他产品上
   3. Modbus协议的通信接口可以有多种选择,如RS232、RS485、以太网等

1.2 协议特点

  1. 支持主从方式,即主站、从站
  2. Modbus协议主要分为两种格式,即Modbus RTU和Modbus ASCII,Modbus RTU使用二进制格 式传输数据,而Modbus ASCII则将数据以ASCII码形式进行传输。此外,Modbus还可以通过TCP/IP协议进行网络通信,称为Modbus TCP/IP。

1.3 协议格式

   1. 起始地址(也就是常说的站号)
   2. 功能码 (01,03,06,10,16等等)
   3. 数据内容
   4. 校验码(CRC16校验)

2.modbus-crc16校验原理方法以及手算验证

2.1 校验方法

 CRC计算方法:
    1.预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
    2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
    3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
    4.如果移出位为0:重复第3步(再次右移一位);如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
   5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
   6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
   7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;

2.2 校验参考代码

     /*
    * @name   CRC_Check
    * @brief  CRC校验
    * @param  CRC_Ptr->数组指针,LEN->长度
    * @retval CRC校验值      
*/
uint16_t CRC_Check(uint8_t *CRC_Ptr,uint8_t LEN)
{
    uint16_t CRC_Value = 0;
    uint8_t  i         = 0;
    uint8_t  j         = 0;

    CRC_Value = 0xffff;
    for(i=0;i<LEN;i++)  //LEN为数组长度
    {
        CRC_Value ^= *(CRC_Ptr+i);
        for(j=0;j<8;j++)
        {
            if(CRC_Value & 0x00001)
                CRC_Value = (CRC_Value >> 1) ^ 0xA001;
            else
                CRC_Value = (CRC_Value >> 1);
        }
    }
    CRC_Value = ((CRC_Value >> 8) +  (CRC_Value << 8)); //交换高低字节

    return CRC_Value;
}

2.3 手算校验过程

 我们以这个数据包为例,来分析一下校验过程:
    Tx:000002-01 03 00 00 00 0A C5 CD
     01 起始地址   03功能码  C5 CD 校验码
  1. 第一个数据为0x01 ,与0xffff,进行异或运算,得到的数值为0xfffe

  2. 0xfffe与0x01进行相与运算,得到的数值为0,所以直接向右移1位,得到的结果为0111 1111 1111 1111

  3. 现在是第一个数据向右移出1位了,重复上述过程

  4. 0111 1111 1111 1111(0x7ffff)与0x01相与,得到的结果为1,所以向右移出一位,得到的结果为0011 1111 1111 1111与0xA001进行异或运算得到的结果为1001 1111 1111 1110(0x9FFE)

  5. 1-5的运算过程如下图(演算的正式过程)
    里插入图片描述

  6. 现在第一个数据向右移出2位了,重复上述过程

  7. 经过演算第一个最后的结果为807E,草图如下(演算的草图)在这里插入图片描述

为了方便演示,我们直接写成C程序跑一下上述过程,看下对不对

在这里插入图片描述经过程序运算,算的的第一个数据0x01的校验码为0x807e,与我们手算的结果一致
接下来拿807e作为tmp的数值,接着运行下一个数据0x03,同理接着运行至最后一个数据0x0A,得到最终的crc计算结果C5CD

最终的运行结果为 在这里插入图片描述

modbus测试程序

#include <stdio.h>
int main(void)
{
    // Tx:000000-01 03 00 00 00 0A C5 CD
    unsigned short tmp = 0xffff;
    unsigned short val = 0;
    unsigned char buff[6] = {0};
    buff[0] = 0x01;
    buff[1] = 0x03;
    buff[2] = 0x00;
    buff[3] = 0x00;
    buff[4] = 0x00;
    buff[5] = 0x0A;

   for(int n = 0; n < 6; n++)
  {
    tmp = buff[n] ^ tmp;
    printf("异或数据为:%x\n",tmp);
    for(int i = 0;i < 8;i++){  /*此处的8 -- 指每一个char类型又8bit,每bit都要处理*/
       
        printf("遍历层数为:%d\t\t最后一位的数为:%d",i*n, tmp & 0x01);
        printf("\t当前tmp为:%x\n",tmp );
        if(tmp & 0x01){
            
            tmp = tmp >> 1;
            tmp = tmp ^ 0xa001;
        }   
        else{
            tmp = tmp >> 1;
        }   
    }   
    printf("第%d个数据通过crc16校验后为 %x\n",n,tmp);
}  



/*将CRC校验的高低位对换位置*/
val = tmp >> 8;
val = val | (tmp << 8); 
printf("交换后为: %X\n",val);
return 0;
}

最后

1.单片机连续发送时,两帧之间的时间大于等于为3.5个字符
2.如有错误,欢迎批评指正

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_47673526/article/details/134290383

智能推荐

图像梯度-sobel算子-程序员宅基地

文章浏览阅读1w次,点赞12次,收藏61次。(1)理论部分x 水平方向的梯度, 其实也就是右边 - 左边,有的权重为1,有的为2 。若是计算出来的值很大 说明是一个边界 。y 竖直方向的梯度,其实也就是下面减上面,权重1,或2 。若是计算出来的值很大 说明是一个边界 。图像的梯度为:有时简化为:即:(2)程序部分函数:Sobelddepth 通常取 -1,但是会导致结果溢出,检测不出边缘,故使..._sobel算子

cuda10.1和cudnn7.6.5百度网盘下载链接(Linux版)_cudnn7.6网盘下载-程序员宅基地

文章浏览阅读3.6k次,点赞17次,收藏8次。cuda10.1和cudnn7.6.5百度网盘下载链接(Linux版)在官网下载不仅慢,,,主要是还总失败。。终于下载成功了,这里给出百度网盘下载链接,希望可以帮到别人百度网盘下载链接提取码: vyg5_cudnn7.6网盘下载

Python正则表达式大全-程序员宅基地

文章浏览阅读9.3w次,点赞69次,收藏427次。定义:正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。上面都是官方的说明,我自己的理解是(仅供参考):通过事先规定好一些特殊字符的匹配规则,然后利用这些字符进行组合来匹配各种复杂的字符串场景。比如现在的爬虫和数据分析,字符串校验等等都需要用_python正则表达式

Vue之条件渲染_条件渲染的基本概念-程序员宅基地

文章浏览阅读973次。条件渲染就是在指定的条件下,渲染出指定的UI。比如当我们显示主页的时候,应该隐藏掉登录等一系列不相干的UI元素。即UI元素只在特定条件下进行显示。而在VUE3中,这种UI元素的显示和隐藏可以通过两个关键字,`v-if` 和`v-show`来实现。但是虽然实现的功能一样,但他们两者有着一些细微的区别。总结起来这个区别就是:v-show控制UI元素隐藏时只是将UI的显示状态变成了不可见,实际上这个UI是存在的,但是v-if隐藏UI元素时则是直接干掉了这个UI元素,使其不显示_条件渲染的基本概念

直播+录播_直播加录播是-程序员宅基地

文章浏览阅读1.2k次。什么是直播回放?简单的说就是腾讯视频【支持将已经直播结束的节目再次播放,】方便你随时观看。目前此功能试运营阶段,最多可查看过往2小时内的节目,后续将可支持最多48小时内的节目。直播+回放+看点+预订功能,全面打通直播节目的过去、现在和未来。 直播回放和暂停功能目前已经同时在PC客户端播放器(2012 Beta2以上版本)和WEB网页的Flash播放器上线,操作简单便捷,如下图_直播加录播是

VDM Alloy 20与 Alloy 926超级不锈钢的化学成分及特性_vdm alloy 36元素含量-程序员宅基地

文章浏览阅读626次。VDM Alloy 20与 Alloy 926超级不锈钢的化学成分及特性化学成分概览材料特性VDM Alloy 20的材料特性包括:• 卓越的抗硫酸和磷酸腐蚀性能• 良好的抗晶间腐蚀能力• 出色的抗氯离子引起的应力腐蚀开裂能力• 良好的抗点蚀和缝隙腐蚀能力• 在室温以及高达500°C的高温下具有良好的机械性能VDM Alloy 926的材料特性包括:出色的抗点蚀和缝隙腐蚀能力与其他奥氏体不锈钢相比,抗应力腐蚀开裂的能力有所提高与氧化性和还原性介质接触时具有良好的耐_vdm alloy 36元素含量

随便推点

ico引入方法_arco的ico怎么导入-程序员宅基地

文章浏览阅读1.2k次。打开下面的网站后,挑选要使用的,https://icomoon.io/app/#/select/image下载后 解压 ,先把fonts里面的文件复制到项目fonts文件夹中去,然后打开其中的style.css文件找到类似下面的代码@font-face {font-family: ‘icomoon’;src: url(’…/fonts/icomoon.eot?r069d6’);s..._arco的ico怎么导入

Microsoft Visual Studio 2010(VS2010)正式版 CDKEY_visual_studio_2010_professional key-程序员宅基地

文章浏览阅读1.9k次。Microsoft Visual Studio 2010(VS2010)正式版 CDKEY / SN:YCFHQ-9DWCY-DKV88-T2TMH-G7BHP企业版、旗舰版都适用推荐直接下载电驴资源的vs旗舰版然后安装,好用方便且省时!) MSDN VS2010 Ultimate 简体中文正式旗舰版破解版下载(附序列号) visual studio 2010正_visual_studio_2010_professional key

互联网医疗的定义及架构-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏17次。导读:互联网医疗是指综合利用大数据、云计算等信息技术使得传统医疗产业与互联网、物联网、人工智能等技术应用紧密集合,形成诊前咨询、诊中诊疗、诊后康复保健、慢性病管理、健康预防等大健康生态深度..._线上医疗的定义

计算机毕业设计 基于大数据的智能家居销量数据分析系统的设计与实现 Java实战项目 附源码+文档+视频讲解_基于大数据的智能家居销售数据分析系统 开题报告-程序员宅基地

文章浏览阅读1k次,点赞8次,收藏4次。随着科技的不断发展,智能家居系统已经成为了人们生活中不可或缺的一部分。而随着智能家居销量的不断增加,如何对这些数据进行有效的分析和利用也成为了当前亟待解决的问题。因此,本文提出了一种基于大数据的智能家居销量数据分析系统的设计与实现。该系统主要分为前台和后台两个部分,用户可以通过前台进行注册登录、查看冰箱信息、获取智能家居资讯等操作,管理员则可以通过后台进行用户管理、家电信息管理、系统管理等工作。通过对智能家居销量数据的分析,可以帮助企业更好地了解市场需求,优化产品设计和生产,提高销售效益。_基于大数据的智能家居销售数据分析系统 开题报告

异常:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:-程序员宅基地

文章浏览阅读3.6w次,点赞2次,收藏19次。问题java使用httpclient或者restTemplate进行https请求时,出现如下异常:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertP..._pkix path building failed: sun.security.provider.certpath.su

c# 窗体开发2 高级控件的使用_tooltiptext c#-程序员宅基地

文章浏览阅读794次,点赞2次,收藏9次。1.单选按钮(RadioButton)同一组中其他单选按钮不能同时选定分组形式:panel GoupBox 窗体方法: 属性 说明 Appearance RadioButton 控件的显示与命令按钮相似 Checked 确定是否已选定控件 方法 ..._tooltiptext c#

推荐文章

热门文章

相关标签