文章目录
1. 串行通讯、RS485、Modbus的联系和区别
Modbus是一种串行通信协议,因此在介绍MODBUS之前,有必要了解一下更为基础的知识,即串行通讯。并且对于很多初学者来说,分清串行通讯、485通讯、MODBUS通讯协议是进行MODBUS通讯的第一步。那么首先我们先区别这三个通讯分别是什么,之间的关系又是什么。
一个通讯的完成,根据计算机系统的层级划分,可以分为物理层、数据链路层、应用层等等等等,在这里,我们只介绍MODBUS一对一的通讯方式,因此只涉及到物理层、数据链路层、应用层等部分分。对于上述各个层级,可能比较抽象,这里我自己的理解是:
电气层(属于物理层):电气层是我为了读者方便理解,自己加的。其具体含义是,两个设备要进行通讯,首先应该进行电气参数的匹配,如果一个设备输出电压是24V,另一个设备输入电压是5V,那么很有可能通讯的时候设备直接被烧坏了。此外,什么是高点平、什么是低电平,两边通讯时,需要共同约定一个规则来定义1和0,这种规则往往是一种阈值电压或差分电压等。换一种角度理解,通讯其实就是各个设备在进行讲话,电气层就是要讲的一句话中,一个单词里的一个字母如何定义。RS485就是一种电气上的接口,它规定了正差分就是1,负差分就是0。
物理层:物理层规定了一个字节是怎么发送的,我们都知道,一个字节是8位,一般来说,如果只有一根通讯线,需要发8位字节的话,就需要用同一根线在不同的时刻发8次,这种通讯方式就是串行通讯。如果我们有8根通讯线,那么就只需要在同一时刻8根通讯线同时发送,就能够将一个字节的数据发送出去。换种角度理解,物理层就是规定,所要说的话中,一个单词是怎么说出来的。串行通讯就是物理层的规则定义,它定义了一个字节是通过怎样的方式进行发送和接收。
数据链路层:数据链路层规定了一个数据帧如何发送和接受。数据帧可以理解为一段能够表达通讯需求的若干个字节。即如何将数据组合成数据块,在数据链路层中称这种数据块为帧(frame),帧是数据链路层的传送单位;如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理(来源于百度百科)。换种角度理解,数据链路层就是规定了如何将一个一个的单词(字节)组合成一句话,并且一句话应该按照怎样的方式去说和理解。Modbus就是一种在数据链路层中的协议规定,他规定了一种开源的通用数据帧格式,按照这种格式进行通讯的两个设备就能较为稳定的进行通讯。
应用层:应用层就是用户对于已经接受到的数据进行何种处理来实现用户的应用的需求,这一部分是软件上用户自己定义的。
这里我所做的内容是通过STM32进行控制,通过RS485电气接口进行串行通讯,并采用Modbus通讯协议。
在理解了上述三个的联系和区别以后,下面就对各个内容进行分别介绍。
2. 串行通讯介绍
2.1 串行通讯的定义:
串行通讯是一种数据通讯方式,与并行通讯的同一时刻多条数据线同时发送数据不同,串行通讯是在不同时刻依次发送一个字节的各个位。
2.2 串行通讯的分类:
根据串行通讯的收发功能不同,串行通讯一般可以分为单工、半双工、全双工。单工是指该串行通讯只能收或者只能发,只能进行单方向的工作。半双工是指,该串行通讯既可以收,也可以发,但是同一时刻下,只能进行收或发。全双工是指,该通讯可以同时进行收和发。
根据串行通讯是否需要进行时钟的同步,可以分为同步通讯和异步通讯两种。这里采用RS485的通讯接口,接口电路中没有专门传递时钟信号的传输线,因此只能采用异步的串行通讯的方式进行收发。
2.3 串行通讯的参数和意义:
在进行串行通讯时,我们的目标是正确的传输一个字节(8位二进制),那么在数据传输过程中,就需要输出和输入两方对串口协议进行一个统一的规定。相关的参数如下:
波特率:波特率是指每秒中传递的二进制的位数。为了避免数据接收时按照错误的节拍接收数据,串口通讯需要提前设置好接收和发送端的波特率。举例说明,假设波特率是9600bts/s,那么传递一个字节(8位),需要的时间是0.83ms,每个位持续的时间是0.104ms。此时如果接收端按照每0.104ms是一个位来对数据进行判断,那么接收端能够接收到正确的信息。但此时如果接收端按照每0.008ms(115200bit/s)一个位的话,可以看出,当发送端还未将全部的数据位发送完成,接收端就已经有了8位数据。这就是接受和发送没有统一波特率带来的通讯出错。
起始位:起始位必须是持续一个比特时间的逻辑“0”电平,标志传送一个字节的开始。
数据位:数据位是需要传递的数据,一般来说是8位,也有7位、6位等。
奇偶校验位:为了保证传递数据的正确性,可以在传递完数据后进行一次奇偶校验,可以选择奇校验或者偶校验或者不校验。奇偶校验是指数据位中,1或者0的个数是奇数还是偶数。
停止位:在上述数据位发送结束后,再发送1bit时间的高电平,表示发送结束。也可设定为1.5或2位时间。
在进行使用时,读者可以仅了解一次串行发送时的电平时序关系,但要始终注意发送和接受两端要采用相同的串行通讯协议,也就是采用相同的波特率、奇偶校验方式、停止位持续时间等。
2.4 STM32中的串行通讯:
STM32的串行通讯的使用可以参照STM32的参考手册USART章节,需要注意的是,STM32的USART是全双工异步串口通讯,有两个传输线TX和RX,其中TX为发送,RX为接收。在进行与其他串口连接时,一般来说,是STM32的TX接外部设备的RX,STM32的RX接外部设备的TX。
3. RS485介绍
3.1 RS485的定义:
RS485是一种电气接口和电平定义,我们已经知道了串行通讯能够传递一个字节,可是这是建立在两个设备能正确传递一个位的基础上才能实现。RS485就是解决如何传递一个位。这就需要设备两端在电气层面上有连接,并且采用相同的电气参数来定义0和1。而RS485就是一种电气接口和电平定义。RS485具有A、B两根线,并且通过A、B两根线之间的压差来定义1和0。A和B的压差在+(2-6)V内为高电平,A和B的压差在-(2-6)V内为低电平。由此就定义了RS485的电气接口和电平。
因为RS485虽然有两根线,但是是通过两根线的压差来表示1和0。这就造成了RS485其实是只有一个数据传输通道,同一时刻只能收或者只能发,因此RS485是一种半双工的通讯方式。
此外还应注意的问题是,RS485设备之间是A接A,B接B。
延伸来说,RS485通讯逐渐取代RS232通讯,是因为RS485的接口电平更小,不易损坏芯片,并且兼容TTL(5V-0V)电平。此外RS485通过两根AB线通讯,可以多台设备组成通讯网

本文深入解析串行通讯、RS485与Modbus RTU协议的关系及区别,涵盖通讯原理、STM32实现及常见问题调试,是嵌入式开发者的实用指南。

816

被折叠的 条评论
为什么被折叠?



