一、引言
学习过单片机的会了解到UART、I2C、SPI这些通信协议,这些协议属于“位”级别的最底层协议。单片机做串口通信的时候,我们通过串口发给单片机三条指令,让单片机做了三件不同的事情,分别是“buzz on”、“led off”和“showstr”。随着系统复杂性的增加,我们希望可以实现更多的指令。而指令越来越多,带来的后果就是非常杂乱无章,导致不同开发人员写出来的程序代码不兼容,不同厂家的产品不能挂到一条总线上通信。
随着这种矛盾的日益严重,就会有聪明人提出更合理的解决方案,提出一些标准来,今后我们的编程必须按照这个标准来,这种标准也是一种通信协议,但是和 UART、I2C、SPI通信协议不同的是,这种通信协议是字节级别的,叫做应用层通信协议。在 1979 年由 Modicon(现为施耐德电气公司的一个品牌)提出了全球第一个真正用于工业现场总线的协议,就是Modbus 协议。
谈到通信协议,一个基本的认识是OSI(Open System Interconnect)模型,全称为开放式通信系统互连参考模型,是国际标准化组织 ( ISO ) 提出的一个试图使各种计算机在世界范围内互连为网络的标准框架。
OSI模型包括七层:物理层、数据链路层、网络层、穿传层、会话层、表示层、应用层。随着时代的发展,OSI已经被TCP/IP 模型淘汰。
OSI模型和TCP/IP模型的对应
二、Modbus通信
根据《GBT 19582.1-2008 基于Modbus协议的工业自动化网络规范》,Modbus通信分为:串行链路上的Modbus和TCP/IP上的Modbus。
Modbus的两种实现
Modbus网络体系结构实例
三、串行链路上的Modbus通信
7层OSI模型对应的Modbus串行通信栈的一般表示
而Modbus在串行链路上的通信有两种传输模式:RTU 模式和 ASCII 模式。由于 ASCII 模式的数据字节是 7bit 数据位,单片机无法实现,而且实际应用的也比较少,所以这里我们讨论常用的 RTU 模式。
Modbus RTU串行通信会涉及物理层、数据链路层、应用层。物理层上通信实现,就是两个设备电气参数的匹配,什么是高电平、什么是低电平,两边通讯时,需要共同约定一个规则来定义1和0(数据最终会被计算机处理成0、1信号进行传输),这种规则往往是一种阈值电压或差分电压等。
例如串口通信采用的是阈值电压,也就是TTL电平,逻辑“1”为+5V,逻辑“0”为0V,有两根通信线:RX和TX,如果是两机互联的话,应该是RX1接TX2,TX1接RX2。STM32的USART是全双工异步串口通讯。
而RS485通信采用的是差分电压,两线压差为-2~-6V表示0,两线压差为+2~+6V表示1,有两根通信线:A和B,如果是两机互联的话,应该是A1接A2,B1接B2。RS485是一种半双工的通讯方式。
另外,关于单工、半双工、全双工:单工就是一段时间内只能设备A发送信号到设备B;半双工就是一段时间内,设备A能发到设备B,设备B也能发到设备A,同一时刻,两个过程不能同时进行;全双工就是在任意时刻,设备A能发到设备B,设备B也能发到A,两个过程可以同时进行。
通信其实就是各个设备之间在进行讲话,物理层就是要讲的一句话中,一个单词里的一个字母如何定义。
数据链路层规定了一个数据帧如何发送和接受。数据帧可以理解为一段能够表达通讯需求的若干个字节。即如何将数据组合成数据块,在数据链路层中称这种数据块为帧(frame),帧是数据链路层的传送单位;如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理(来源于百度百科)。换种角度理解,数据链路层就是规定了如何将一个一个的单词(字节)组合成一句话,并且一句话应该按照怎样的方式去说和理解。Modbus就是一种在数据链路层中的协议规定,他规定了一种开源的通用数据帧格式,按照这种格式进行通讯的两个设备就能较为稳定的进行通讯。
应用层就是用户对于已经接受到的数据进行何种处理来实现用户的应用的需求,这一部分是软件上用户自己定义的。
笔者工作后进行的第一项任务就是,在STM32单片机上编写程序,基于RS485通信接口,采用Modbus RTU通讯。下一篇将介绍Modbus RTU在数据链路层上的数据帧。
参考文章:
图解网络传输单工、半双工、全双工 - 知乎 (zhihu.com)
RS-232 RS-485 TTL电平标准 以及串口、COM口、UART口、USB转TTL、USB转串口_485电平-CSDN博客
《手把手教你学51单片机:第18章 RS485 通信与 Modbus 协议 》——宋雪松