一、485总线和硬件电路

典型的串行通讯标准是RS232和RS485,它们定义了电压,阻抗等,但不对软件协议给予定义。RS-485总线标准规定了总线接口的电气特性标准即对于2个逻辑状态的定义:正电平在+2V~+6V之间,表示一个逻辑状态;负电平在-2V~-6V之间,则表示另一个逻辑状态;数字信号采用差分传输方式,能够有效减少噪声信号的干扰。
RS485总线,传输距离长、抗干扰性能强、稳定性好。已经广泛的应用于工业设备的使用中。

通常使用AB双绞线连接,复杂场合可以使用带屏蔽层的双绞线。

MCU本身不具有485总线的通讯标准。但是可以采用中继转换芯片SP3485,将串口信号和485的信号做相应的电平转换。

实际中的具体电路(共占用MCU的3个IO口),其中有两根是串口通讯的RX和TX引脚。
还有一根是RE,高电平时,向外发送数据;低电平时,接收数据。
RS485通信
- 在软件程序层面,其实利用的就是单片机的串口功能,发送和接收数据。
- 在硬件层面,就是多加了1个电平转换芯片。将串口的ttl电平转换为了485使用的电平。
二、cubeMX配置




三、RS485驱动程序
最重要的逻辑:
当MCU往外发数据时候,RE=1,
当MCU发送完数据时候,RE=0,
任意空闲状态,RE=0
/*
* rs485.c
*/
#include "rs485.h"
#include "../usart/usart.h"
#include "main.h"
/*
RS485总线通信,使用UART8,这是RS485专用的printf函数
调用方法:RS485_printf("123"); //向UART8发送字符123
*/
void RS485_printf (char *fmt, ...)
{
char buff[USART2_REC_LEN+1]; //用于存放转换后的数据 [长度]
uint16_t i=0;
va_list arg_ptr;
HAL_GPIO_WritePin(RS485_RE_GPIO_Port,RS485_RE_Pin, GPIO_PIN_SET);//RS485收发选择线RE为高电平(发送)
va_start(arg_ptr,fmt);
vsnprintf(buff, USART2_REC_LEN+1,fmt,arg_ptr);//数据转换
i=strlen(buff);//得出数据长度
if(strlen(buff)>USART2_REC_LEN)i=USART2_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
HAL_UART_Transmit(&huart2,(uint8_t *)buff,i,0xffff);//串口发送函数(串口号,内容,数量,溢出时间)
va_end(arg_ptr);
HAL_GPIO_WritePin(RS485_RE_GPIO_Port,RS485_RE_Pin, GPIO_PIN_RESET);//RS485收发选择线RE为低电平(接收)
}
//所有USART串口的中断回调函数HAL_UART_RxCpltCallback,统一存放在【USART1.C】文件中。
/*
* rs485.h
*/
#ifndef RS485_RS485_H_
#define RS485_RS485_H_
#include "stm32f1xx_hal.h" //HAL库文件声明
#include <string.h>//用于字符串处理的库
#include <stdarg.h>
#include <stdlib.h>
#include "stdio.h"
extern UART_HandleTypeDef huart2;//声明USART2的HAL库结构体
void RS485_printf (char *fmt, ...); //RS485发送
#endif /* RS485_RS485_H_ */
以上只有发送程序,至于接收程序,在USART.C中的串口中断回调函数里面(和USART1\USART3一起)。
/*
* usart1.c
*/
#include "usart.h"
uint8_t USART2_RX_BUF[USART2_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节.
uint16_t USART2_RX_STA=0;//接收状态标记//bit15:接收完成标志,bit14:接收到0x0d,bit13~0:接收到的有效字节数目
uint8_t USART2_NewData;//当前串口中断接收的1个字节数据的缓存
uint8_t RS485orBT;//当RS485orBT标志位为1时是RS485模式,为0时是蓝牙模式
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口中断回调函数
{
if(huart ==&huart2)//判断中断来源(RS485)
{
USART2_RX_BUF[0]=USART2_NewData;//收到数据放入缓存数组(只用到1个数据存放在数组[0])
USART2_RX_STA++;//数据接收标志位加1
HAL_UART_Receive_IT(&huart2,(uint8_t *)&USART2_NewData, 1); //再开启接收中断
}
}
这边的接收只接受了一个字节的数据,没有什么意义。
四、应用程序
做这个实验需要两个及两个以上的485设备一起通信。暂时没法完成。
工业中RS485设备常使用的是Modbus通信协议。以后有时间可以写一下,这个通信协议。
本文介绍了如何使用STM32CubeIDE进行RS485通信的开发,包括485总线和硬件电路的介绍、cubeMX配置、RS485驱动程序的编写。在硬件层面,通过SP3485电平转换芯片连接MCU的串口,发送数据时设置RE为高电平,发送完成后切换为低电平。在软件上,利用串口中断接收数据,实验需要至少两个485设备进行通信,并提及工业中常使用Modbus协议。
4979

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



