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的库函数发送数据...//延时100usdelay_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);                        //GPIOA9复用为USART1GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);                       //GPIOA10复用为USART1//USART1端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;                      //GPIOA9与GPIOA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                                   //复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                //速度50MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                    //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                                   //上拉GPIO_Init(GPIOA,&GPIO_InitStructure);                                           //初始化PA9,PA10//USART1 初始化设置USART_InitStructure.USART_BaudRate = baud;                                       //波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b;                     //字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;                          //一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;                             //无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;    //无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                  //收发模式USART_Init(USART1, &USART_InitStructure);                                         //初始化串口1USART_Cmd(USART1, ENABLE);                                                      //使能串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                  //开启相关中断//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                              //串口1中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;                           //抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                              //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                 //IRQ通道使能NVIC_Init(&NVIC_InitStructure);                                                    //根据指定的参数初始化VIC寄存器
}void USART1_WriteBytes(uint8_t *pbuf,uint32_t len)
{uint32_t i =0;for(i=0; i<len; i++){//发送数据USART_SendData(USART1,*pbuf++);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);       }
}//初始化IO 串口2
//baud:波特率
void RS485_Init(uint32_t baud)
{    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);               //使能GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);                //使能USART2时钟//串口2引脚复用映射GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);          //GPIOA2复用为USART2GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);            //GPIOA3复用为USART2//USART2    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;                //GPIOA2与GPIOA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                        //复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                   //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                       //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                       //上拉GPIO_Init(GPIOA,&GPIO_InitStructure);                               //初始化PA2,PA3RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);                 //使能GPIOA时钟//PG8推挽输出,485模式控制  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                             //GPIOG8GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                      //输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;                 //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                       //推挽输出GPIO_InitStructure.GPIO_PuPd  =  GPIO_PuPd_UP;                       //上拉GPIO_Init(GPIOG,&GPIO_InitStructure);                               //初始化PG8//USART2 初始化设置USART_InitStructure.USART_BaudRate = baud;                           //波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b;         //字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;              //一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;                 //无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;      //收发模式USART_Init(USART2, &USART_InitStructure);                             //初始化串口2USART_Cmd(USART2, ENABLE);                                          //使能串口 2USART_ClearFlag(USART2, USART_FLAG_TC);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);                       //开启接收中断//Usart2 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;              //抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                  //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                     //IRQ通道使能NVIC_Init(&NVIC_InitStructure);                                        //根据指定的参数初始化NVIC寄存器RS485_TX_EN=0;                                                      //默认为接收模式   }//RS485发送len个字节.
//pbuf:发送区首地址
//len:发送的字节数
void RS485_Send_Data(uint8_t *pbuf,uint32_t len)
{uint32_t i;RS485_TX_EN=1;                                             //设置为发送模式for(i=0; i<len; i++)                                     //循环发送数据{USART_SendData(USART2,pbuf[i]);                        //发送数据while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);   }   delay_us(100);RS485_TX_EN=0;                                               //设置为接收模式   }int main(void)
{ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置中断优先级分组2NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//串口1,波特率115200bps,开启接收中断USART1_Init(115200);//RS485初始化,115200bpsRS485_Init(115200);while(1){}
}void USART1_IRQHandler(void)       //串口1中断服务程序
{uint8_t d;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收中断{//接收数据d = USART_ReceiveData(USART1);    RS485_Send_Data(&d,1);} } void USART2_IRQHandler(void)
{uint8_t d;if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据{    d =USART_ReceiveData(USART2);                  //读取接收到的数据USART2->DRUSART1_WriteBytes(&d,1);}
} 

STM32的RS485通信相关推荐

  1. STM32运用RS485通信总结

    1.RS485接口原理: 1.串口:串口是一种接口标准,它规定了接口的电气标准,简单说只是物理层的一个标准.没有规定接口插件电缆以及使用的协议,所以只要接口电缆符合串口标准就可以在实际中灵活使用,在串 ...

  2. STM32:RS485通信和Modbus通信协议汇总

    RS485通信和Modbus通信协议汇总 1. 主从模式 RS-485上的软件层协议ModBus主要依赖于主从模式.主从模式是指在半双工通讯方式上,2个或者2个以上的设备组成的通讯系统中: (1) 至 ...

  3. STM32物联网项目-RS485通信(Modbus协议)

    RS485通信(Modbus协议) 协议介绍 RS485介绍:http://t.csdn.cn/bOuFX Modbus协议:http://t.csdn.cn/mgioX CubeMX配置 RS-48 ...

  4. 基于UCOSII的RS485通信(STM32F107)

    一.实现效果 基于ucosii实时操作系统的RS485通信,采用USART + DMA进行收发, 二.开发环境 开发工具:KEIL V5 开发板: STM32f107RC 采用方式:USART + D ...

  5. 基于STM32F103单片机的智能温室大棚RS485通信温湿度监测

    系统功能设计 (末尾附文件) STM32单片机智能大棚485上传温湿度光照检测补光 本系统由STM32单片机RS485采集板和STM32单片机RS485显示按键板组成. 采集板由STM32F103C8 ...

  6. 嵌入式STM32入门之STM32基础串口通信

    STM32基础串口通信 一.前言 二.串口协议 (1)浅谈设备通信方式 (2)具体串口协议 (3)STM32的串口通信 (4)RS-232通信协议 (5)USB To TTL(CH340) 5.1 C ...

  7. RS485通信如何设计EMC电路?

    目录 1.RS-485标准 2.电磁兼容性 2.1.静电放电测试 2.2.电快速瞬变测试 2.3.电涌瞬变测试 3.通过/失败标准 4.瞬变保护 5.RS-485瞬变抑制网络 5.1.保护方案1 5. ...

  8. 三菱的触摸屏usb驱动_资深工程师一步一步教你PLC与西门子触摸屏的RS485通信

    点击上方"蓝字"关注我们 今天为大家带来的是PLC与西门子触摸屏的RS485通信,RS-485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485.R ...

  9. fullcalendar 显示的时间间隔只有四十五分钟_NHR系列智能显示控制仪表RS485通信中应用...

    请点击上方蓝字关注我们! 01 摘要 NHR系列智能显示控制仪表是经过多年开发制造经验而设计生产,集诸多全新功能于一身的新一代智能显示控制仪表.针对现场温度.压力.液位.速度.流量等各种信号进行采集. ...

最新文章

  1. openresty 前端开发序
  2. 读懂深度迁移学习,看这文就够了 | 赠书
  3. 武汉.NET俱乐部论坛已经恢复
  4. 同程旅游缓存系统(凤凰)打造Redis时代的完美平台实践
  5. Bone Collector II
  6. 并发编程——线程——CPython的GIL解释器锁
  7. python必须使用try except而不是if else的场合
  8. VBA 自制 TreeView 树视图,附加控件 TreeView 最优替代方案
  9. [转载] Python数学实验与建模 课后习题第1章解析
  10. Madwifi Mad coding:自底向上分析associated_sta的更新过程 —— RSSI和MACADDR等信息获取的底层原理...
  11. springboot与dubbo整合
  12. 编译原理 实验一 词法分析器
  13. Pascal 转 C++ 教程1
  14. EOS.CYBEX社区满分入围EOS超级节点候选人!
  15. EPSON RC+ 7.0 使用记录一
  16. 华为手机将微信聊天记录迁移到 SD卡
  17. Adobe After Effects
  18. 2019年淘宝运营里中小卖家需要掌握的技能!
  19. ac远程web管理 r470gp tl_良心升级!TL-R470GP-AC一体化路由也支持无缝漫游了
  20. 百度开发者认证流程及所需信息

热门文章

  1. win10连接filco蓝牙键盘
  2. 商业原画与商业插画的区别
  3. 宠物粮竞争后半场:国牌与洋牌的「信任保卫战」
  4. C#实现Gauss完全主元消去法
  5. 眼球追踪技术给各大科技巨头带来的四大应用前景
  6. fetchone()和fetchall()的准确读音
  7. Ubuntu释放缓存/内存和显存
  8. 分组查询:group by
  9. [深度应用]·DC竞赛轴承故障检测开源Baseline(基于Keras1D卷积 val_acc:0.99780)
  10. 快速玩转ECS竞价实例