3、Modbus通讯协议详解

前言

在平时用的时候模块都会带有自己的通讯协议,直接查看手册用就可以,所以平时对于modbus虽然是在用但是原理性的东西时常忘记。

但是如果你做一个底层,自己写一个通讯协议,这时候就要对协议本身有所了解。

这里只是对平时用到的做一下简单的介绍,想了解的推荐大家去看一下,如果大家只想了解Modbus协议可以参考本文章。

整理完整了,RS485串口通讯最详细讲解 (qq.com)https://mp.weixin.qq.com/s/WJCWpWjG0nuM_uJwIuQAmA

本文中只对Modbus RTU做了详解,接下来将会添加Modbus ICP,添加CRC16校验方式。

关于完整版的Modbus协议,推荐大家看看这篇文章:

modbus通讯协议详解_lilifang_2011的博客-CSDN博客_modbus通讯协议https://blog.csdn.net/lilifang_2011/article/details/116058066?ops_request_misc=&request_id=&biz_id=102&utm_term=modbus%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-116058066.142%5Ev25%5Epc_rank_34,157%5Ev15%5Enew_3&spm=1018.2226.3001.4187搞懂了上面两个链接里的内容,然后在实际情况下用一下就完全明白了。

干货|手把手带你搞懂Modbus通信协议_果果小师弟的博客-CSDN博客_modbus通讯协议https://blog.csdn.net/qq_39400113/article/details/118369506?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165709672916781685371163%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165709672916781685371163&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-118369506-null-null.142%5Ev31%5Epc_rank_34,185%5Ev2%5Econtrol&utm_term=modbus%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE&spm=1018.2226.3001.4187

一、485通讯注意的点

通过串口485数据发送接收时,一定要注意:

1、底层的串口配置,其串口号(tx/rx)与相应的485口(AB)对应;

2、485芯片使能端口,高电平是发送,低电平接收;

3、当485收发都不能用的时候,请检查硬件,如485串口转换器是否是坏的,串口驱动是否配置正确,引脚使能是否正确

4、当485只能收不能发或者只能发不能收的时候,请检查串口的使能引脚是否正确,因为这时候是485的使能引脚配置错误。

 485转串口硬件检查小技巧,找两个485转串口A接A,B接B,互相发送,发送即接收到的数据

二、Modbus RTU通讯协议

 以上两幅图是参考第三个链接。

Modbus-RTU协议只需要看懂功能码0x03、0x06、0x10这三个基本的就已经足够了;分别回想下其数据域部分:

0x03–主机需要发送起始地址+寄存器数量,从机回复总字节数+数据;

0x06–主机发送起始地址+数据内容(因为你只需要修改一个,所以起始地址就是所要修改的地址),从机返回起始地址+数据内容(发现居然一样!)

0x10–主机发送起始地址+寄存器个数+总字节数+数据,从机返回起始地址+寄存器数量
 

三、Modbus支持的功能码

 

四、CRC校验

有在线工具CRC(循环冗余校验)在线计算_ip33.com

算法步骤:16位

  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码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐者-桥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值