简单了解RS485与RS232(UART)
- 一、UART和RS232、RS485的关系
- 1、UART
- 2、RS232/RS485
- 3、RS232 与 RS485 的区别与联系
- 二、Modbus协议说明
- 1、什么是协议
- 2、Modbus协议说明
- 3、Modebus通信过程
- 4、Modbus存储区
- 5、Modbus协议类型
- 6、Modbus功能码
- 三、stm32+HC-SR04超声波模块,对外提供RS485和Modbus协议
- 参考
前言
当前智能汽车上一般配置有12路超声波雷达,这些专用超声波雷达内置了MCU,直接输出数字化的测距结果,一般硬件接口采用串口RS485,通信协议采用modbus。请思考:
1)RS485与RS232(UART)有什么不同?
2)Modbus协议是什么?
3)如果让你设计一款 12路车载超声波雷达,采用 stm32F103+HC-SR04超声波模块,对外提供RS485和Modbus协议,你的设计方案是什么?
一、UART和RS232、RS485的关系
1、UART
UART,是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),既然是“器”,显然,它就是个设备而已,要完成一个特定的功能的硬件,它本身并不是协议。那么它要完成什么功能呢?它的最基本功能,是串行数据和并行数据之间的转换。我们知道,计算机中的数据以Byte为基本单位,对一个Byte的存取是并行的,即,同时取得/写入8个bit。而串行通信,需要把这个Byte“打碎”,按照时间顺序来收发以实现串行。例如:
内存中的数据是: 1 1 1 0 0 1 0 1
串行发送的实际效果是(按时间排序【注1】):
1
0
1
0
0
1
1
1
接收则是上述过程的逆过程。
这就是UART做的最基本工作,进一步的,它还要控制“发车的班次”,比如确认一个Byte的这8个bit是什么时候开始的,又是什么时候结束的,两个班次之间至少要隔多长时间的缓冲,等等。这一部分,也具有协议的特征,但是相对于道路上的协议,更具有一般性,或曰,是与车在什么道路上开,相对独立的。
2、RS232/RS485
RS232,RS485是一种电平标准
数据在通信双方之间传输,本质是传输物理的电平 比方说传输5V的电压 -1V的电压信号,这些物理信号在传输过程中会受到很多干扰,比方说你传输一个5V的电压,到了接收端可能就变成了4.8V,并且通信的双方高低电平的参考电压可能不同。
那么这个时候就需要一个电平标准,来判断多少V的电压是高电平 1,多少V的电压是低电平 0 这就诞生了 RS-485 RS-232
RS232:是电子工业协会(Electronic Industries Association,EIA) 制定的异步传输标准接口,同时对应着电平标准和通信协议(时序),其电平标准:+3V~+15V对应0,-3V~-15V对应1。
全双工
逻辑1:-15V–5V
逻辑0:+3V–+15V
RS485:RS485是一种串口接口标准,为了长距离传输采用差分方式传输,传输的是差分信号,抗干扰能力比RS232强很多。两线压差为-2-6V表示0,两线压差为+2+6V表示1
半双工
逻辑1:+2V~+6V
逻辑0: -2V~ -6V
注意485的电平指的是485-A和485-B两根传输线,两线间的电压差。而不是传输线上的电压
3、RS232 与 RS485 的区别与联系
区别:
(1)抗干扰性:
RS485 接口是采用平衡驱动器和差分接收器的组合,抗噪声干扰性好。
RS232 接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容 易产生共模干扰,所以抗噪声干扰性弱。
(2)传输距离:
RS485 接口的最大传输距离标准值为 1200 米(9600bps 时),实际上可达 3000 米。
RS232 传输距离有限,最大传输距离标准值为 50 米,实际上也只能用在 15 米左右。
(3)通信能力:
RS-485 接口在总线上是允许连接多达 128 个收发器, 即具有多站能力,这样用户可以利用 单一的 RS-485 接口方便地建立起设备网络 。
RS-232 只允许一对一通信。
(4)传输速率:
传输速率较低,在异步传输时,波特率为 20Kbps。
RS-485 的数据最高传输速率为 10Mbps 。
联系:
都可通过 DB-9 连接器连接.
接口均可采用屏蔽双绞线传输。
都是串行通信。
通信方式都是全双工。 (一般情况 485 是半双工)
二、Modbus协议说明
1、什么是协议
在了解什么是Modbus之前,我们先来看下什么是协议
协议是一个汉语词汇,读音为xié yì,意思是共同计议,协商;经过谈判、协商而制定的共同承认、共同遵守的文件。
简单的说协议就是规则,我们需要了解规则,遵守规则,运用规则
我们的单片机之间互相通信,以及单片机和上位机通信中,规定了不同的内容规范,这个规范是通信的双方都需要遵守的,这样就可以实现两者的通信。
而这个协议规范可以有很多种,来适应不同的设备以及通信要求等,我们常见的就有IIC SPI UART串口通信协议等等。而Modbus也是一个串行通信协议。
2、Modbus协议说明
Modbus诞生于1979年 莫迪康公司 后来被施耐德电气公司收购。Modbus提供通用语言用于彼此通信的设备和设备。
Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus作为目前工业领域应用最广泛的协议
Modbus协议标准开放、公开发表且无版权要求
Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以在各种介质上传输,如双绞线、光纤、红外、无线等
Modbus协议消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,方便形成工业控制网络
3、Modebus通信过程
注意Modbus是一主多从的通信协议
Modbus通信中只有一个设备可以发送请求。其他从设备接收主机发送的数据来进行响应,从机是任何外围设备,如I/O传感器,阀门,网络驱动器,或其他测量类型的设备。从站处理信息和使用Modbus将其数据发送给主站。
也就是说,不能Modbus同步进行通信,主机在同一时间内只能向一个从机发送请求,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。
从机不会自己发送消息给主站,只能回复从主机发送的消息请求。
并且,Modbus并没有忙机制判断,比方说主机给从机发送命令, 从机没有收到或者正在处理其他东西,这时候就不能响应主机,因为modbus的总线只是传输数据,没有其他仲裁机制,所以需要通过软件的方式来判断是否正常接收。
4、Modbus存储区
既然从机存储数据,那么肯定要有一个存储区,那就需要文件操作,我们都知道这文件可以分为只读(-r)和读写(-wr)两种类型
并且存储的数据类型可以分为 :布尔量 和 16位寄存器
布尔量比如IO口的电平高低,灯的开关状态等。
16位寄存器比如 传感器的温度数据,存储的密码等。
Modbus协议规定了4个存储区 分别是0 1 3 4区 其中1区和4区是可读可写,1区和3区是只读。
Modbus协议规定了4个存储区 分别是0 1 3 4区 其中1区和4区是可读可写,1区和3区是只读
并且Modbus还给每个区都划分了地址范围 主机向从机获取数据时,只需要告诉从机数据的起始地址,还有获取多少字节的数据,从机就可以发送数据给主机
Modbus数据模型规定了具体的地址范围,每一个从机,都有实际的物理存储,跟modbus的存储区相对应,主机读写从机的存储区,实际上就是对从机设备对应的实际存储空间进行读写。
5、Modbus协议类型
在上面我们已经说明了Modbus可以在各种介质上传输,那么他的传输模式也分为三种。包括ASCII、RTU(远程终端控制系统)、TCP三种报文类型
串行端口存在多个版本的Modbus协议,而最常见的是下面四种:
Modbus-Rtu
Modbus-Ascii
Modbus-Tcp
ModbusPlus
Modbus RTU是一种紧凑的,十六进制表示数据的方式,Modbus ASCII是一种采用Ascii码表示数据,并且每个8Bit 字节都作为两个ASCII字符发送的表示方式。
RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。
Modbus协议使用串口传输时可以选择RTU或ASCII模式,并规定了消息、数据结构、命令和应答方式并需要对数据进行校验。ASCII 模式采用LRC校验,RTU模式采用16 位CRC校验。通过以太网传输时使用TCP,这种模式不使用校验,因为TCP协议是一个面向连接的可靠协议。
当然常用的就是RTU模式,ASCII一般很少
举一个简单的例子,如果我们需要发送一个数字10 那么RTU模式下,只需要发送 0x0A 总线上传输数据形式为: 0000 1010
而ASCII码模式则将数据1和0转为’1’和’0’,需要发送0x31(1) 0x30(0)两个字节数据。总线上传输数据形式为: 0011 0001 0011 0000
详细的我们等下再阐述
Modbus-RTU协议
Modbus报文帧结构
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。
Modbus报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容
Modbus协议在串行链路上的报文格式如下所示:
从站地址 功能码 数据 CRC/LRC 1 byte 1 byte N bytes 2 bytes
帧结构 = 从机地址 + 功能吗 + 数据 + 校验 从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答)
功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能.
数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。
校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确
6、Modbus功能码
Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。
Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示:
CRC校验
**错误校验(CRC)域占用两个字节包含了一个16位的二进制值。**CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。
比如主机发出01 06 00 01 00 17 98 04, 98 04 两个字节是校验位,那么从机接收到后要根据01 06 00 01 00 17 再计算CRC校验值,从机判断自己计算出来的CRC校验是否与接收的CRC校验(98 04主机计算的)相等,如果不相等那么说明数据传输有错误,这些数据就不能要
CRC校验流程:
1、预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。
2 、把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。
3、将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。
4 、如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。
5、重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。
6 、重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。
7、最终CRC寄存器的值就是CRC的值。
此外还有一种利用预设的表格计算CRC的方法,它的主要特点是计算速度快,但是表格需要较大的存储空间,该方法此处不在阐述
三、stm32+HC-SR04超声波模块,对外提供RS485和Modbus协议
超声波雷达模块
超声波传感器:12个HC-SR04模块,每个模块有Trig和Echo引脚。
连接方式:将每个HC-SR04模块的Trig和Echo引脚分别连接到STM32F103的GPIO引脚上。
微控制器
微控制器:STM32F103系列,至少需要12个GPIO用于超声波模块的Trig和Echo信号。
时钟设置:72MHz的系统时钟频率。
通信接口
RS485接口:采用MAX485芯片,实现RS485物理层通信。
串口配置:STM32的USART接口用于与MAX485通信。
电源管理
电源:汽车电源通常为12V,需要DC-DC转换器将12V转换为STM32和HC-SR04模块所需的5V和3.3V。
3.2 软件设计
底层驱动
GPIO驱动:配置GPIO引脚为输出模式(Trig)和输入模式(Echo)。
定时器驱动:使用定时器捕获HC-SR04的Echo信号高电平时间,计算距离。
USART驱动:配置USART用于RS485通信,波特率根据具体需求设置,一般为9600或115200。
测距算法
触发信号:发送至少10us的高电平到Trig引脚。
捕获回波:定时器捕获Echo信号的高电平时间,通过时间计算距离。
Modbus协议栈
帧格式:实现Modbus RTU协议的帧格式,包括地址域、功能码、数据域和CRC校验
读写操作:支持基本的读寄存器和写寄存器操作,读取超声波模块的测距数据。
数据处理
距离测量:每个超声波模块测量到的距离存储在STM32的寄存器中。
错误处理:处理测量超时或无效数据的情况,确保系统的可靠性。
3.3 实现步骤
硬件连接
超声波模块连接:将每个HC-SR04的Trig和Echo分别连接到STM32的GPIO引脚,例如:Trig1 -> PA0, Echo1 -> PA1, Trig2 -> PA2, Echo2 -> PA3,依此类推。
RS485连接:MAX485的DI连接到STM32的TX引脚,RO连接到STM32的RX引脚,DE和RE引脚连接在一起并连接到STM32的一个控制引脚(例如PA4),用于控制发送和接收状态。
电源连接:确保所有模块都供电正常,STM32和HC-SR04都需要3.3V/5V供电,MAX485需要5V供电。
软件开发
- 初始化
配置系统时钟。
初始化GPIO引脚。
初始化定时器用于捕获Echo信号。
初始化USART用于RS485通信。
2. 超声波测距
触发每个HC-SR04模块,启动测距。
捕获Echo信号高电平时间,通过定时器计算距离。
将距离数据存储在寄存器中,供Modbus协议读取。
3. Modbus通信
实现Modbus RTU协议的帧解析和生成。
处理Modbus主站的请求,根据请求的功能码读取或写入寄存器。
返回对应的距离数据或执行相应操作。
4. 测试与调试
使用Modbus主站测试工具,验证通信协议的正确性。
通过调试工具和串口监视器,调试距离测量和通信功能。
参考
链接: 基于stm32的12路超声波雷达方案设计与RS485/Modbus集成
链接: 深入理解UART、IIC、SPI与RS232以及RS485的区别
链接: 详解Modbus通信协议—清晰易懂