这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » MODBUS协议CRC16校验

共10条 1/1 1 跳转至

MODBUS协议CRC16校验

菜鸟
2012-05-31 10:09:17     打赏
在modbus协议通信的过程中对数据包的校验有比较高的要求,这样才不容易出现掉包,错包的情况,在modbus,crc校验中比较容易的事crc16的校验只需用到查表就可以解决。其程序也比较简单。 下面就是其crc16校验的产生
//CRC校验子函数,入口:数据指针+数据段长度   
unsigned int crc(unsigned char *puchMsg , unsigned short usDataLen)  
{  
  unsigned char uchCRCHi = 0xFF ; /* 高CRC初始化*/  
  unsigned char uchCRCLo = 0xFF ; /* 低CRC初始化*/  
  unsigned int uIndex ;  /* 用来查表 */  
      
   while (usDataLen--) /* 整个数据缓冲区,不带数据的CRC两个字节 */  
   {
        uIndex = uchCRCHi ^ *puchMsg++ ;   // calculate the CRC
        uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
        uchCRCLo = auchCRCLo[uIndex] ;
   }
    return (((unsigned int)(uchCRCHi) << 8) | uchCRCLo) ;
}   
附带传上在校验对比中能用到的crc16计算比对的工具。比较好用的。



关键词: MODBUS     协议     CRC16     校验    

菜鸟
2012-05-31 10:14:16     打赏
2楼

1、读可读写数字量寄存器(线圈状态):

计算机发送命令:[设备地址] [命令号01] [起始寄存器地址高8] [8] [读取的寄存器数高8] [8] [CRC校验的低8] [CRC校验的高8

设备地址

功能代码

起始寄存器地址

读取寄存器数

CRC校验

CRC校验

8

8

8

8

8

8

例:[11][01][00][13][00][25][CRC][CRC

意义如下:

<1>设备地址:在一个485总线上可以挂接多个设备,此处的设备地址表示想和哪一个设备通讯。例子中为想和17(十进制的17是十六进制的11)通讯。 

<2>命令号01:读取数字量的命令号固定为01

<3>起始地址高8位、低8位:表示想读取的开关量的起始地址(起始地址为0)。比如例子中的起始地址为19

<4>寄存器数高8位、低8位:表示从起始地址开始读多少个开关量。例子中为37个开关量。

<5>CRC校验:是从开头一直校验到此之前。在此协议的最后再作介绍。此处需要注意,CRC校验在命令中的高低字节的顺序和其他的相反。 

设备响应:[设备地址] [命令号01] [返回的字节个数][数据1][数据2]...[数据n][CRC校验的低8] [CRC校验的高8

设备地址

功能代码

传输字节个数

传输数据

CRC校验

CRC校验

8

8

8

12....n

8

8

例:[11][01][05][CD][6B][B2][0E][1B][CRC][CRC

意义如下:

<1>设备地址和命令号和上面的相同。

<2>返回的字节个数:表示数据的字节个数,也就是数据12...n中的n的值。

<3>数据1...n:由于每一个数据是一个8位的数,所以每一个数据表示8个开关量的值,每一位为0表示对应的开关断开,为1表示闭合。比如例子中,表示20(索引号为19)开关闭合,21号断开,22闭合,23闭合,24断开,25断开,26闭合,27闭合...如果询问的开关量不是8的整倍数,那么最后一个字节的高位部分无意义,置为0

<4>CRC校验同上。 


院士
2012-06-01 17:23:24     打赏
3楼
唉,
楼主 上传文章还是一传传一整篇吧!
分章传别人是看不懂的,尤其对于新手来说。

院士
2012-06-02 09:50:47     打赏
4楼
了解他的目的,就知道是为什么这么做了

菜鸟
2012-06-04 11:31:35     打赏
5楼
⊙﹏⊙b汗,都是你逼的~~~~(_

工程师
2012-06-14 15:25:08     打赏
6楼
楼上说的是,整个文章发布比较好

菜鸟
2012-08-23 14:26:18     打赏
7楼

楼主有wireless M-Bus资料吗?


助工
2012-09-18 09:03:11     打赏
8楼
流行的PLC例如西门子S7-200、300等的modbus用的是CRC16校验吗?                              

菜鸟
2012-11-12 15:28:03     打赏
9楼
05 99

菜鸟
2015-05-11 14:57:07     打赏
10楼
嗯,确实好用,谢谢楼主。

共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]