crc错误 modbus poll_Modbus通讯错误检测方法
标准的Modbus串行网络采用两种错误检测方法。奇偶校验对每个字符都可用,帧检测(LRC和CRC)应用于整个消息。它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧。
用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任何从设备都能作为正常反应。如果从设备检测到一传输错误,消息将不会接收,也不会向主设备作出回应。这样超时事件将触发主设备来处理错误。发往不存在的从设备的地址也会产生超时。
1、奇偶校验
如果指定了奇或偶校验,“1”的位数将算到每个字符的位数中(ASCII模式7个数据位,RTU中8个数据位)。例如RTU字符帧中包含以下8个数据位:
1 1 0 0 0 1 0 1
整个”1“的数目是4个。如果使用了偶校验,帧的奇偶校验位将是0,便得整个”1“的个数仍是4个。如果使用了奇校验,帧的奇偶校验位将是1,便得整个”1“的个数是5个。
如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测。代替一附加的停止位填充至要传输的字符帧中。
2、LRC检测
使用ASCII模式,消息包括了一基于LRC方法的错误检测域。LRC域检测了消息域中除开冒号及结束的回车换行号外的内容。
LRC域是一个包含一个8位二进制的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。
LRC方法是将消息中的8Bit的字节连续累加,丢弃了进位。
LRC简单函数如下:
1 static unsiged charLRC(auchMsg,usDataLen)2 unsigned char *auchMsg;/*要进行计算的消息*/
3 unsigned short usDataLen;/*LRC要处理的字节的数量*/
4 {5 unsigned char uchLRC = 0; /*LRC字节初始化*/
6 while (usDataLen--) /*传送消息*/
7 uchLRC += *auchMsg++; /*累加*/
8 return ((unsigned char)(-(char_uchLRC)));9 }
LRC算法:
参与校验数据:从地址码到数据区的所有数据。
算法:相邻2个16进制符相加求和。
校验码:取其和的低8位的补码为校验码。
例如:
LRC算法举例
起始码
地址码
功能码
数据区
校验码
停止码
:
01
03
21 02 00 02
LRC
CR/LF
求和:H01+H03+H21+H02+H00+02 = H29
求:H29的补码:HD7
LRC校验码为:HD7
3、CRC检测
使用RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消息的内容。CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
CRC码的计算方法是,先预置16位寄存器全为1。再逐步把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。
在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一字节,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。
这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相相异或,这个过程与以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。CRC码中的数据发送、接收时低字节在前。
计算CRC码的步骤为:
预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;
把第一个8位数据与16位CRC寄存器的低位相异或,把结果放于CRC寄存器;
把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
如果最低位为0:重复第3步(再次移位); 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
重复步骤2到步骤5,进行下一个8位数据的处理;
最后得到的CRC寄存器即为CRC码。
参考:http://www.360doc.com/content/14/0120/10/7991404_346584755.shtml
crc错误 modbus poll_Modbus通讯错误检测方法相关推荐
- Modbus通讯错误检测方法
标准的Modbus串行网络采用两种错误检测方法.奇偶校验对每个字符都可用,帧检测(LRC和CRC)应用于整个消息.它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧. 用户 ...
- crc错误 modbus poll_干货丨从Modbus开始说现场总线!
从Modbus开始说现场总线(一) PLC应用,在了解了硬件配置和逻辑编程之后,很大一部分工作就是处理现场通讯了.各式各样的现场总线,其实还是有一定的规律的.我们在现场最常见到的现场总线协议,恐怕就是 ...
- 计算机存储程序错误检验,内存错误怎么办?内存错误的修复与检测方法介绍
导语: 电脑具有存储功能,这点毋庸置疑,一款电脑的内存大小能够在一定程度上决定这款产品的性能.但是,我们电脑用户在使用电脑的过程中常常会遇到电脑内部才能错误的故障.那么,内存错误的原因是什么?电脑内存 ...
- 瑞友客户端无法建立跟远程计算机的连接,瑞友天翼终端错误信息的原因以及解决方法大全.doc...
瑞友天翼终端错误信息的原因以及解决方法大全 终端错误信息的原因以及解决办法大全 由于在数据加密中存在错误,此会话将结束.请尝试重新连接到远程计算机. 原因: 数据加密为在网络连接上进行数据传输提供了安 ...
- linux 下搭建yolov3错误,yolov3---报段错误的可能原因及解决方法
参考: ************************************************************************************************ ...
- oracle 配置数据库错误,Oracle数据库配置错误信息解决方法
Oracle数据库配置错误信息 Oralce数据库的错误信息经常会出现,我们看见的都是错误的代码,至于错误原因究竟是什么还一时半会难以解答,所以就把一些常见的错误整理了一下,来看看也许对你有帮助的. ...
- Win7 IIS7 HTTP 错误 404.2 - Not Found解决方法 ISAPI CGI
Win7 IIS7 HTTP 错误 404.2 - Not Found解决方法 ISAPI CGI 参考文章: (1)Win7 IIS7 HTTP 错误 404.2 - Not Found解决方法 I ...
- IIS HTTP 错误 404.17 - Not Found 解决方法
IIS HTTP 错误 404.17 - Not Found 解决方法 参考文章: (1)IIS HTTP 错误 404.17 - Not Found 解决方法 (2)https://www.cnbl ...
- 转Linux环境下段错误的产生原因及调试方法小结
Linux环境下段错误的产生原因及调试方法小结 转载于:https://www.cnblogs.com/objectDetect/p/7575659.html
最新文章
- js 异步for each
- 神经网络与机器学习 笔记—基本知识点(下)
- tomcat集群 (自带Cluster集群)
- 【离散数学】集合的包含排斥原理
- Hadoop入门基础教程 Hadoop之单词计数
- 2013年微软编程之美大赛初赛第二题(博客园居然可以插入代码!!)
- gnuplot 使用时遇到的问题
- canvas 2.0
- 微服务架构实战(五):选择微服务部署策略
- 生成指定范围的随机数_JAVA 获取随机数的方式以及应用案例
- vue组件基础知识及组件间通讯
- php tp框架教程,从零开始了解thinkphp框架,tp框架基础教程
- 电脑激活Office时出现异常,激活界面白屏或提示无法与服务器
- (三)幸福取决于关注点所在
- Android友盟统计
- 登录前的人机验证VAPTCHA
- 如何画双层和四层的PCB
- 58到家的MySQL军规来看看吧,或许对你也有帮助哦
- React Native 连接夜神模拟器
- 1美元从零开始训练Bert,手把手教你优雅地薅谷歌云TPU羊毛
热门文章
- 无法启动此程序,因为计算机中丢失 MSVCP120.dll。尝试安装该程序以解决此问题
- pip安装提示PermissionError: [WinError 5]错误问题解决
- 我可以从iOS DeviceSupport中删除数据吗?
- 在objective-c / cocoa中抛出异常
- 如何在SQL SELECT中执行IF…THEN?
- 高级篇:独立开发者 5 分钟入门 ASO
- **Python垃圾回收机制
- 《网站分析师实战指南》一2.6 让例行公事的报告见鬼去吧
- JPA使用原生SQL查询
- ERROR 1222 (21000): The used SELECT statements have a different number of columns :