前言
在平时用的时候模块都会带有自己的通讯协议,直接查看手册用就可以,所以平时对于modbus虽然是在用但是原理性的东西时常忘记。
但是如果你做一个底层,自己写一个通讯协议,这时候就要对协议本身有所了解。
这里只是对平时用到的做一下简单的介绍,想了解的推荐大家去看一下,如果大家只想了解Modbus协议可以参考本文章。
整理完整了,RS485串口通讯最详细讲解 (qq.com)https://mp.weixin.qq.com/s/WJCWpWjG0nuM_uJwIuQAmA
本文中只对Modbus RTU做了详解,接下来将会添加Modbus ICP,添加CRC16校验方式。
关于完整版的Modbus协议,推荐大家看看这篇文章:
一、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校验
算法步骤:16位
- 置16位寄存器为全1,作为CRC寄存器。
- 把一个8位数据与16位CRC寄存器的低字节相异或,把结果放于CRC寄存器中。
- 把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位(移出位)。
- 如果最低位为0,重复2.3(再移位);如果最低位为1,CRC寄存器与多项式A001H(1010 0000 0000 0001)进行异或。
- 重复2.3、2.4,直到右移8次,这样整个8位数据全部进行了处理。
- 重复2.2-2.5,进行下一个8位数据的处理。
- 将一帧的所有数据字节处理完后得到CRC-16寄存器。
- 将CRC-16寄存器的低字节和高字节交换,得到的值即为CRC-16码。