1.简介
与CAN类似,RS-485是一种工业控制环境中常用的通讯块议,它具有抗干扰能力强、传输距离远的特点。RS-485通讯协议由RS-232协议改进而来,协议层不变,只是改进了物理层,因而保留了串口通讯协议应用简单的特点。
用的是SP3485芯片:
通信的时候,A端口连接另一个设备的A端口,B端口连接B端口,不是交叉相连。
最多能够连接128个设备,所以在某种情况下可以取代网络,RE引脚用来控制通讯数据的方向,要么进行接收,要么进行发送。
本质还是串口通信
RS485_RE为高电平的时候,DE为高电平有效,允许发送数据
RS485_RE为低电平的时候,RE为低电平有效,允许接收数据
所以当你要发送数据的时候 ,需要将与RE连接的引脚置为高电平、
2.编码
所以我们大致可以得到一个程序模板:
发送数据函数
void rs485_send(uint8_t *pbuf,uint32_t len)
{
//设置RS458为发送模式,将所连引脚设置高电平输出
PGout(2)=1;
//调用串口2的库函数发送数据
...
//延时100us
delay_us(100);
//设置RS485为接收模式
PGout(2)=0;
}
接收函数,使用中断接收
void USART2_IRQHandler(void)
{
uint8_t data=0;
if(USART2_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
data = USART2_ReceiveData(USART2);
}
下面是演示代码,供参考
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_usart.h"
//模式控制
#define RS485_TX_EN PGout(8) //485模式控制.0,接收;1,发送.
static GPIO_InitTypeDef GPIO_InitStructure;
static USART_InitTypeDef USART_InitStructure;
static NVIC_InitTypeDef NVIC_InitStructure;
void USART1_Init(uint32_t baud)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能USART1时钟
//串口1对应引脚复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1)