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接口通讯相关推荐

  1. 基于STM32的485通讯传感器采集程序

    基于STM32的485通讯传感器采集程序 先来看看硬件连接,大致就这样连接! 一般来说,RS485是硬件,而他软件方面是modbus协议,用到最多的是RTU方式. 工作方式:主机(STM32)通过串口 ...

  2. 了解串口协议,及完成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 ...

  3. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

    参考:基于STM32-Oled(IIC)的使用 作者:奋斗的小殷 发布时间: 2021-05-07 13:09:26 网址:https://blog.csdn.net/boybs/article/de ...

  4. STM32通过I2C接口采集温湿度

    目录 一.I2C总线协议 1. I2C总线简介 1.1 物理接口 1.2 通讯特征 1.3 I2C总线状态 2. I2C总线通信协议 2.1 起始位和结束位 2.2 数据格式与应答 2.3 数据传输通 ...

  5. STM32的USART串口通讯程序

    文章目录 一.STM32 USART串口通信 1.串口通信简介 1.1.物理层 1.2.协议层 2.STM32 的 USART 简介 二.STM32的USART串口通讯程序 1.创建项目 2.添加.s ...

  6. STM32基于SPI接口的OLED数据显示

    文章目录 一.SPI简介 1.1 什么是SPI 1.2 SPI原理 1.3 SPI的连接方式 1.4 协议层 二.OLED 2.1 OLED原理 2.2 点阵编码原理与显示 三.OLED显示实验 3. ...

  7. 计算机网口通讯协议,接口通讯协议定义.doc

    接口通讯协议定义 PAGE PAGE 37 接口通讯协议定义 篇一:通讯接口概念 通信接口协议综述 (收集多处资料集合原创,综合232.422.485.USB及网络通讯等) 在现场数据采集和数据传输中 ...

  8. 10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据

    10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据.

  9. API接口通讯参数规范(2)

    针对[API接口通讯参数规范]这篇文章留下的几个问题进行探讨. 问题1 试想一下,如果一个http请求返回一个500给我们,那我们是不是都不用看详情都知道该次请求发生了什么?这正是一个标准的结果码意义 ...

  10. STM32的USART串口通讯程序(查询方式)

    STM32的USART串口通讯程序(查询方式) 文章目录 STM32的USART串口通讯程序(查询方式) 一.USART介绍 1.异步通信: 2.同步通信: 二.CubeMX创建项目 1.点击ACCE ...

最新文章

  1. 1.10 对象序列化控制输入输出
  2. lucene 第一天
  3. day63-webservice 01.cxf介绍
  4. 生命周期结束,Spring Boot 1.x退役
  5. 大数据分析平台具备什么功能特点
  6. glassfish启动后不能进入部署页面_使用Jenkins实现项目持续集成部署
  7. declare-styleable中format详解
  8. Node.js相关——CommonJS规范
  9. 毕设题目:Matlab图像检索
  10. 根据不同条件查询_好用的大数据即席查询工具——秒级响应
  11. Springboot内置tomcat优化
  12. 1252 :[蓝桥杯2015初赛]奇妙的数字 C/C++
  13. 中兴B860AV2.1-T_3.0_s905l3-b_uwe5621_线刷固件(附短接点示意图)
  14. batchplot插件用法_最好用的CAD批量打印机SmartBatchPlot使用指南
  15. 微信群打卡小程序_签到打卡小程序,哪个更适合你?
  16. umd文件结构深度解剖
  17. 秀米编辑器如何排版svg推文,以展开为模板讲解
  18. python+opencv 批量修改视频分辨率
  19. 计算机网络协议有那些,计算机网络协议有哪些
  20. 转行做软件编程开发的经历

热门文章

  1. Mysql环境变量的配置(详细图解)
  2. 生意参谋指数转化api
  3. 微分方程求解二(偏微分方程求解)
  4. 干货!Web 网页设计规范
  5. 基于FPGA的四轴运动控制IC设计(verilog)
  6. 一个简单的爬虫例子(代码)
  7. 个人博客搭建教程——基于WordPress
  8. Java基本数据类型自动转换规则
  9. DW——验证注册页面 设计JavaScript
  10. VC++6.0软件安装教程(win10亲测可用)