STM32使用485接口通讯
STM32使用485接口通讯
简单来说,485通信,实质还是串口通信。通过电平转换芯片,将TTL电平转换成485电平,即可使用485接口通信。
串口
串口是一种接口标准,只是物理层的一个标准。没有规定接口插件电缆以及使用的协议。
典型的串行通讯标准是RS232, RS485, RS422等,他们定义了电压,阻抗等,但不对软件协议给予定义。
串口通过电平转换电路,可以将串口电平(TTL)转换成485电平、232电平等。
RS485特点
- 接口电平低
- 逻辑“1”两线电压差为+(2~6)V;逻辑“0”两线电压差为-(2~6)V。
- 传输速度高
- 10米时,传输速度可达35Mbps
- 1200米时,传输速度可达100Kbps
- 抗干扰能力强
- 使用平衡驱动器和差分接收器组合,抗共模干扰能力强,
- 传输距离远,支持多节点
- RS485总线最长可以传输1200m以上(速率<=100Kbps)
- 一般支持32个节点,特定芯片支持128个,256,甚至400个节点
- 此处采用的芯片是ADM2483,可以支持256个节点
- RS485接口连接形式
- 点对点 A-A B-B
- 线性
- 总线型
- 不可是星型,环形
- 常见接口
- RORORO 接收输入端
- DIDIDI 发送输出端
- RE‾\overline {RE}RE 接收使能信号,低电平有效
- DEDEDE 发送使能信号,高电平有效
- 由于半双工,常将RE‾\overline {RE}RE和DEDEDE连在一起,由MCU某个引脚控制。但本人使用的电路板具有收发自动切换电路(TX连到三极管上拉下拉,具体实现可以参考 https://blog.csdn.net/wangguchao/article/details/80200402 其中的5.3自动切换电路)
RS485通信注意
- 对于MCU来说,485仅仅是使用电平转换芯片将TTL电平,转成485电平。即要使用485传输,本质上还是串口传输。
- 两个485通信,其技术指标应该是相同的,否则不能通信。
- 波特率
- 数据长度
- 停止位
- 校验位
- 硬件流控制
- 收发模式
相关代码
- 端口初始化与中断设置
/*
函数名称: RS485_Bus_Init(void)
输入: 无
输出: 无
功能: 设置485所在串口的端口与中断
注意: 此处使用的是串口5,U5TX->PC12,U5RX->PD2使用了宏定义,请注意将宏定义内容添加到.h文件中
*/
void RS485_Bus_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);//PC12->U5TXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);//PD2->U5RXGPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOD, &GPIO_InitStructure);RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5,ENABLE);//复位串口5RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5,DISABLE);//停止复位USART_InitStructure.USART_BaudRate = RS485_BUS_BOUND;//波特率设置USART_InitStructure.USART_WordLength = RS485_BUS_WORDLENGTH;//8位数据长度USART_InitStructure.USART_StopBits = RS485_BUS_STOPBITS;//一个停止位USART_InitStructure.USART_Parity = RS485_BUS_PARITY;///奇偶校验位USART_InitStructure.USART_HardwareFlowControl = RS485_BUS_FLOWCTRL;//无硬件数据流控制USART_InitStructure.USART_Mode = RS485_BUS_MODE;//收发模式USART_Init(UART5, &USART_InitStructure); //初始化串口NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn; //使能串口2中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);
}
- 中断服务函数
/*
函数名称: UART5_IRQHandler(void)
输入: 无
输出: 无
功能: 串口接收非空中断,串口接收数据,存在串口缓存buf中
注意: 无
*/
void UART5_IRQHandler(void)
{u8 res;if(USART_GetITStatus(UART5,USART_IT_RXNE) != RESET){res = USART_ReceiveData(UART5);if(RS485_BUS_RXCNT<64){RS485_BUS_RXBUF[RS485_BUS_RXCNT]=res;RS485_BUS_RXCNT++;}}
}
- 发送数据
/*
函数名称: RS485_BUS_SendData(u8 *buf, u8 len)
输入: u8 *buf 发送数据的数组u8 *len 发送数据的长度
输出: 无
功能: 将本地数据通过串口发送出去
注意: 无
*/
void RS485_BUS_SendData(u8 *buf, u8 len)
{u8 t;for(t=0;t<len;t++){while(USART_GetFlagStatus(UART5,USART_FLAG_TC)==RESET);USART_SendData(UART5,buf[t]);}while(USART_GetFlagStatus(UART5,USART_FLAG_TC)==RESET);RS485_BUS_RXCNT = 0;
}
- 接收数据
/*
函数名称: RS485_BUS_ReceiveData(u8 *buf,u8 *len)
输入: u8 *buf 存放接收数据的数组u8 *len 存放接收数据的长度
输出: 上述指针传递
功能: 从串口缓存中接收数据到本地缓存
注意: 串口缓存最大只能64个字节
*/
void RS485_BUS_ReceiveData(u8 *buf,u8 *len)
{u8 rxlen=RS485_BUS_RXCNT;u8 i=0;*len=0;delay_ms(10);if((rxlen==RS485_BUS_RXCNT)&&rxlen) //接收到了数据且接收完成{for(i=0;i<rxlen;i++){buf[i]=RS485_BUS_RXBUF[i];}*len=RS485_BUS_RXCNT;RS485_BUS_RXCNT=0;}
}
- rs485.h
#define RS485_BUS_BOUND 9600
#define RS485_BUS_WORDLENGTH USART_WordLength_8b//USART_WordLength_8b//USART_WordLength_9b
#define RS485_BUS_STOPBITS USART_StopBits_1//USART_StopBits_1//USART_StopBits_0_5//USART_StopBits_2//USART_StopBits_1_5
#define RS485_BUS_PARITY USART_Parity_No//USART_Parity_No//USART_Parity_Even//USART_Parity_Odd
#define RS485_BUS_FLOWCTRL USART_HardwareFlowControl_None//USART_HardwareFlowControl_None//USART_HardwareFlowControl_RTS//USART_HardwareFlowControl_CTS//USART_HardwareFlowControl_RTS_CTS
#define RS485_BUS_MODE USART_Mode_Rx|USART_Mode_Tx//USART_Mode_Rx//USART_Mode_Tx
总结
485通信和串口通信,对MCU来说是没有差异的。了解串口通信,通过电平转换芯片即可以完成485通信。
第一篇文章,多有错漏还请各位斧正。
STM32使用485接口通讯相关推荐
- 基于STM32的485通讯传感器采集程序
基于STM32的485通讯传感器采集程序 先来看看硬件连接,大致就这样连接! 一般来说,RS485是硬件,而他软件方面是modbus协议,用到最多的是RTU方式. 工作方式:主机(STM32)通过串口 ...
- 了解串口协议,及完成STM32的USART串口通讯程序,并用keil观察波形
文章目录 前言 一.串口协议 1.RS-232 2.485标准 二.RS-232.485和TTL电平 1.RS-232电平 2.485 3.TTL电平 4.区别 三.USB/TTL转232 1.CH3 ...
- STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)
参考:基于STM32-Oled(IIC)的使用 作者:奋斗的小殷 发布时间: 2021-05-07 13:09:26 网址:https://blog.csdn.net/boybs/article/de ...
- STM32通过I2C接口采集温湿度
目录 一.I2C总线协议 1. I2C总线简介 1.1 物理接口 1.2 通讯特征 1.3 I2C总线状态 2. I2C总线通信协议 2.1 起始位和结束位 2.2 数据格式与应答 2.3 数据传输通 ...
- STM32的USART串口通讯程序
文章目录 一.STM32 USART串口通信 1.串口通信简介 1.1.物理层 1.2.协议层 2.STM32 的 USART 简介 二.STM32的USART串口通讯程序 1.创建项目 2.添加.s ...
- STM32基于SPI接口的OLED数据显示
文章目录 一.SPI简介 1.1 什么是SPI 1.2 SPI原理 1.3 SPI的连接方式 1.4 协议层 二.OLED 2.1 OLED原理 2.2 点阵编码原理与显示 三.OLED显示实验 3. ...
- 计算机网口通讯协议,接口通讯协议定义.doc
接口通讯协议定义 PAGE PAGE 37 接口通讯协议定义 篇一:通讯接口概念 通信接口协议综述 (收集多处资料集合原创,综合232.422.485.USB及网络通讯等) 在现场数据采集和数据传输中 ...
- 10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据
10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据.
- API接口通讯参数规范(2)
针对[API接口通讯参数规范]这篇文章留下的几个问题进行探讨. 问题1 试想一下,如果一个http请求返回一个500给我们,那我们是不是都不用看详情都知道该次请求发生了什么?这正是一个标准的结果码意义 ...
- STM32的USART串口通讯程序(查询方式)
STM32的USART串口通讯程序(查询方式) 文章目录 STM32的USART串口通讯程序(查询方式) 一.USART介绍 1.异步通信: 2.同步通信: 二.CubeMX创建项目 1.点击ACCE ...
最新文章
- 1.10 对象序列化控制输入输出
- lucene 第一天
- day63-webservice 01.cxf介绍
- 生命周期结束,Spring Boot 1.x退役
- 大数据分析平台具备什么功能特点
- glassfish启动后不能进入部署页面_使用Jenkins实现项目持续集成部署
- declare-styleable中format详解
- Node.js相关——CommonJS规范
- 毕设题目:Matlab图像检索
- 根据不同条件查询_好用的大数据即席查询工具——秒级响应
- Springboot内置tomcat优化
- 1252 :[蓝桥杯2015初赛]奇妙的数字 C/C++
- 中兴B860AV2.1-T_3.0_s905l3-b_uwe5621_线刷固件(附短接点示意图)
- batchplot插件用法_最好用的CAD批量打印机SmartBatchPlot使用指南
- 微信群打卡小程序_签到打卡小程序,哪个更适合你?
- umd文件结构深度解剖
- 秀米编辑器如何排版svg推文,以展开为模板讲解
- python+opencv 批量修改视频分辨率
- 计算机网络协议有那些,计算机网络协议有哪些
- 转行做软件编程开发的经历