STM32的RS485通信
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通信相关推荐
- STM32运用RS485通信总结
1.RS485接口原理: 1.串口:串口是一种接口标准,它规定了接口的电气标准,简单说只是物理层的一个标准.没有规定接口插件电缆以及使用的协议,所以只要接口电缆符合串口标准就可以在实际中灵活使用,在串 ...
- STM32:RS485通信和Modbus通信协议汇总
RS485通信和Modbus通信协议汇总 1. 主从模式 RS-485上的软件层协议ModBus主要依赖于主从模式.主从模式是指在半双工通讯方式上,2个或者2个以上的设备组成的通讯系统中: (1) 至 ...
- STM32物联网项目-RS485通信(Modbus协议)
RS485通信(Modbus协议) 协议介绍 RS485介绍:http://t.csdn.cn/bOuFX Modbus协议:http://t.csdn.cn/mgioX CubeMX配置 RS-48 ...
- 基于UCOSII的RS485通信(STM32F107)
一.实现效果 基于ucosii实时操作系统的RS485通信,采用USART + DMA进行收发, 二.开发环境 开发工具:KEIL V5 开发板: STM32f107RC 采用方式:USART + D ...
- 基于STM32F103单片机的智能温室大棚RS485通信温湿度监测
系统功能设计 (末尾附文件) STM32单片机智能大棚485上传温湿度光照检测补光 本系统由STM32单片机RS485采集板和STM32单片机RS485显示按键板组成. 采集板由STM32F103C8 ...
- 嵌入式STM32入门之STM32基础串口通信
STM32基础串口通信 一.前言 二.串口协议 (1)浅谈设备通信方式 (2)具体串口协议 (3)STM32的串口通信 (4)RS-232通信协议 (5)USB To TTL(CH340) 5.1 C ...
- RS485通信如何设计EMC电路?
目录 1.RS-485标准 2.电磁兼容性 2.1.静电放电测试 2.2.电快速瞬变测试 2.3.电涌瞬变测试 3.通过/失败标准 4.瞬变保护 5.RS-485瞬变抑制网络 5.1.保护方案1 5. ...
- 三菱的触摸屏usb驱动_资深工程师一步一步教你PLC与西门子触摸屏的RS485通信
点击上方"蓝字"关注我们 今天为大家带来的是PLC与西门子触摸屏的RS485通信,RS-485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485.R ...
- fullcalendar 显示的时间间隔只有四十五分钟_NHR系列智能显示控制仪表RS485通信中应用...
请点击上方蓝字关注我们! 01 摘要 NHR系列智能显示控制仪表是经过多年开发制造经验而设计生产,集诸多全新功能于一身的新一代智能显示控制仪表.针对现场温度.压力.液位.速度.流量等各种信号进行采集. ...
最新文章
- openresty 前端开发序
- 读懂深度迁移学习,看这文就够了 | 赠书
- 武汉.NET俱乐部论坛已经恢复
- 同程旅游缓存系统(凤凰)打造Redis时代的完美平台实践
- Bone Collector II
- 并发编程——线程——CPython的GIL解释器锁
- python必须使用try except而不是if else的场合
- VBA 自制 TreeView 树视图,附加控件 TreeView 最优替代方案
- [转载] Python数学实验与建模 课后习题第1章解析
- Madwifi Mad coding:自底向上分析associated_sta的更新过程 —— RSSI和MACADDR等信息获取的底层原理...
- springboot与dubbo整合
- 编译原理 实验一 词法分析器
- Pascal 转 C++ 教程1
- EOS.CYBEX社区满分入围EOS超级节点候选人!
- EPSON RC+ 7.0 使用记录一
- 华为手机将微信聊天记录迁移到 SD卡
- Adobe After Effects
- 2019年淘宝运营里中小卖家需要掌握的技能!
- ac远程web管理 r470gp tl_良心升级!TL-R470GP-AC一体化路由也支持无缝漫游了
- 百度开发者认证流程及所需信息