求助 给个modbus rtu协议的完整代码 最好附有详细解释 初学者 谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助 给个modbus rtu协议的完整代码 最好附有详细解释 初学者 谢相关的知识,希望对你有一定的参考价值。

最近在做一个数据采集器,modbus rtu的C语言不会编程,能否给个详细的完整的例程,并附有详细的解释 ,盼高手指点一二 ,不胜感激!<a apporig="63065" target="_blank" onclick="javascript:return redirectWrapped(this);" class="thirdAppLink" href="http://www.mcuzx.net/forum.php?mod=redirect

参考技术A 大哥! 么分数 还让我们写代码,做人要厚道,有付出才有回报 参考技术B 楼上说的.....还真是那么回事。。。

ModBus通信协议的Modbus RTU 协议使用汇总

1、RTU模式

当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两
个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的
数据。
代码系统
· 8位二进制,十六进制数0...9,A...F 
· 消息中的每个8位域都是一个两个十六进制字符组成
每个字节的位
· 1个起始位
· 8个数据位,最小的有效位先发送
· 1个奇偶校验位,无校验则无
· 1个停止位(有校验时),2个Bit(无校验时)
错误检测域
· CRC(循环冗长检测) 

 

 2、RTU帧

使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0...9,A...F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的消息帧如下所示:

  技术分享图片

技术分享图片

 

3、Modbus RTU协议格式

 

请求和响应带有六个字节的前缀,如下:
      byte 0:     设备地址
      byte 1:     功能码
      byte 2:     寄存器地址
      byte 3:     寄存器地址
      byte 4:     数据长度
      byte 5:     数据长度
      byte 6:     CRC校验
      byte 7:     CRC校验

      技术分享图片

 

      技术分享图片

4、常用的功能码

0x01 读取 输出 继电器的状态

       技术分享图片

      技术分享图片

 

0x02 读取 输入 继电器的状态

      技术分享图片

 

0x03 读多个寄存器

      技术分享图片

 

0x05 写单个输出继电器的状态

      技术分享图片

 

0x0F 写多个输出继电器的状态

      技术分享图片

 

0x10 写多个寄存器

      技术分享图片

 

5、举例:Modbus-RTU读取温湿度仪表

      技术分享图片

 














以上是关于求助 给个modbus rtu协议的完整代码 最好附有详细解释 初学者 谢的主要内容,如果未能解决你的问题,请参考以下文章

ModBus通信协议的Modbus RTU 协议使用汇总

ModBus(RTU TCP UDP通信)及利用socket通信(DTU)实现Modbus-RTU通信协议

STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发

STM32+RS485+Modbus-RTU(主机模式+从机模式)-标准库/HAL库开发

C语言如何编写modbus RTU协议?

MODBUS RTU协议原理及功能码解析