STM32串口实现485双机通信原理

发布者:快乐飞翔最新更新时间:2024-03-28 来源: elecfans关键字:STM32  串口 手机看文章 扫描二维码
随时随地手机看文章

RS485通信想必大家都知道,在学习RS232时,都会拿485(RS485下文就用485代替)和其作对比。485优缺点不说,网上有。


我用的是STM32库函数学的485通信,所以接下来就讲讲STM32串口实现485双机通信的原理:


485和232都是基于串口的通讯接口,在数据的收发操作上都是一致的。但是他两的通讯模式却大不相同~!232是全双工(例:A->B的同时B->A,瞬时同步)工作模式,而485是半双工(发时不能收,收时不能发)工作模式。在232通信中,主机在发送数据的同时可以收到从机发过来的数据;但在485通信中,收发要经过模式位的切换来进行,譬如发送数据时,会把模式为置‘1’,表示为发送模式,此时不能接收;当接收数据时,会把模式位置‘0’,表示为接收模式,此时不能发送。


在讲STM32串口实现485双机通信的原理之前,先来复习一下串口中的中断知识点:

串口的中断类型有很多种。这里主要讲两种:接收到数据中断和发送数据完成中断。这两个中断跟两个标志位有密切关系:RXNE(读数据寄存器非空)和TC(发送完成)。譬如在接收到数据的时候(RXNE,读数据寄存器非空),我们要产生中断。在发送数据结束的时候(TC,发送完成)要产生中断。这两种中断的产生方法都是在开启串口中断函数(USART_ITConfig();)中配置。并在获取中断状态函数(USART_ITStatus();)中判断是发送中断还是接受中断。


注意

01

有人问当产生接收中断时,没看到程序中清除中断标志啊,那不就一直中断下去了吗?这里官方规定有两种方法清除中断标志(书里面也有):1、尽快读取USART_DR(数据寄存器),通过读USART_DR可以将该位清零;2、可以直接向该位写‘0’,直接清零。

02

两块板子的串口波特率一定要相同,否则将得不到想要的数据。

STM32串口实现485双机通信的原理(库函数):

❈1、在主函数中,扫描按键。一旦key0按下,首先将5个字节的数据存入rs485buf[]数组中,然后调用RS485_Send_Data(rs485buf,5);函数将5个字节的数据发送到串口。❈

STM32串口实现485双机通信原理

❈2、进入RS485_Send_Data();函数中,先通过标志位将485设置为发送模式(RS485_TX_EN=1),然后循环5次,将这5个字节数据,通过库函数:USART_Send_Data();发送到USART_DR寄存器(自动发送),最后通过标志位将485设置为接收模式(RS485_TX_EN=0)。❈

STM32串口实现485双机通信原理

❈3、前两个是发送。现在是接收了。主函数中通过RS485_Receive_Data();不停的接收。❈❈4、进入RS485_Receive_Data();函数中,如果一直没有按按键,则不会发送数据,也就不会产生接收中断,也就不会往我们定义的接收缓冲区(RS485_RX_BUF[64])里写数据。RS485_RX_CNT计数器的值也就是‘0’,对应在RS485_Receive_Data();函数中就不会进入里面的if语句(下图中红框)❈

STM32串口实现485双机通信原理

如果按键按下了,就会发送数据,就会产生接收中断,就会往我们定义的接收缓冲区(RS485_RX_BUF[64])里写数据,RS485_RX_CNT计数器的值也就开始自增,对应在RS485_Receive_Data();函数中就会进入里面的if语句,从之前定义的接收缓冲区(RS485_RX_BUF[64])里面取数据。


关键字:STM32  串口 引用地址:STM32串口实现485双机通信原理

上一篇:STM32编程为何内部不应开DAC缓冲
下一篇:STM32高手进阶之路与实用学习步骤

推荐阅读最新更新时间:2026-03-22 15:56

【菜鸟必看】STM32 串口接收不定长数据中断检测相关问题
今天给大家介绍STM32串口接受不定长数据中断检测的相关问题。能够推测,在UART收到最后一帧数据后,假如随后的一个数据帧的时长内未收到新的数据,则IDLE信号有效.假如数据包之间间隔大于一个数据帧,就能够用IDLE信号作为检测数据包完毕的标志. 运用DMA接管UART-Rx数据,当检测到DMA数据满,或DMA数据半满,或UART的IDLE时,读取DMA数据.假如DMA缓存空间足够大(大于最大的数据包长度),也能够只以IDLE信号为标志. 运用类似的思维,能够用3种方式达到. 启用UART的RXNE中断,运用RXNE中断检测第一数据帧,并读取第一个数据,其次启动DMA接管(DMA设置为Normal模式)和IDLE中断,并关闭RXN
[单片机]
STM32单片机学习】第15章 通信—调试串口
15.1 关于串口 15.1.1 串口理论知识 说到串口,经常提到TTL、RS232、RS422、RS485,简单的说,就是为了适应不同的环境条件,使用了不同的电平标准。假如微处理器和板载的蓝牙透传模块通信时,一般就使用TTL电平,引脚直接连接即可。假如微处理器在工业现场,需要连接一个几十米外的装置,则应该考虑将TTL电平转为RS232、RS422、RS485。 图 15.1.1 不同通信电平应用的场景 如下表 15.1.1 是几个通信接口标准总结。可以发现为了加大传输距离,人们依次尝试了增加电压、差分传输等方式。 表 15.1.1 常见通信接口标准 以TTL电平的接口为例讲解串口怎么传输数据,对于RS2
[单片机]
STM32与树莓派串口通信实现(简易教程,无需安装micro-ROS版)
零、预设: 本次实验是为了给ROS2模块小车的通信打基础,我们选择stm32f407和树莓派4B进行电机控制和数据处理,二者之间需要进行串口通信,找到一个比较方便的方法(无需安装micro-ROS) 一、基本思路: 和普通的串口通信其实都差不多,只是stm32发送的数据要用树莓派的ros系统上来接收,我们这次只是为了验证能否正常通信,于是树莓派的ros系统上我们就用cutecom串口收发助手来进行接收 二、具体操作: 1、接线: 我们使用TTL转串口来进行,注意stm32引出的串口RX、TX要和TTL转串口的TX、RX交错连接,引脚电平3v3,别忘了GND。 2、stm32端的代码编
[单片机]
<font color='red'>STM32</font>与树莓派<font color='red'>串口</font>通信实现(简易教程,无需安装micro-ROS版)
STM32 USART串口通信深度解析(第9篇)
一、通信协议介绍 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。 当STM32想要实现一些功能,但是需要外挂一些其他模块才能实现,这就需要在两个设备之间连接上一根或多跟通信线,通过通信线路发送或者接收数据,完成数据交换,从而实现控制外挂模块和读取外挂模块数据的目的。 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发。 单工:只允许数据单向传输; 双工:指通信双方能够进行双向通信; 半双工:发送数据和接收数据不能同时传输; 全双工:可以同时进行发送数据和接受数据,一般有两根通信线,一根发送数据,一根接收数据,发送线路和接收线路互不影响。 时钟特性分为同步和异步。 同步:一般有时钟线连接,接收设备可以在时钟
[单片机]
<font color='red'>STM32</font> USART<font color='red'>串口</font>通信深度解析(第9篇)
stm32串口——标志位学习
/* 在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束。 当USART_DR中的数据传送到移位寄存器后,TXE被设置,此时移位寄存器开始向TX信号线按位传输数据,但因为TDR已经变空,程序可以把下一个要发送的字节(操作USART_DR)写入TDR中,而不必等到移位寄存器中所有位发送结束,所有位发送结束时(送出停止位后)硬件会设置TC标志。   另一方面,在刚刚初始化好USART还没有发送任何数据时,也会有TXE标志,因为这时发送数据寄存器是空的。TXEIE和TCIE的意义很简单,TX
[单片机]
单片机 STM32 HAL uartext串口功能
/*************笔记**************** 1、CudeMX中配置串口时,需要增加DMA功能,并使能串口中断!!! Mode--Asynchronous Hardware Flow Control(RS232)--Disable 2、在stm32f1xx_it.c中,找到void USART1_IRQHandler(void),并在用户代码区加入UsartReceive_IDLE(&huart1); 备注:根据实际串口号,进行修改,变通,当出现多个串口时,在每个串口中断函数里,都要加入该函数。 extern void UsartReceive_IDLE(UART_HandleTypeD
[单片机]
《SLAM导航机器人基础》第三章:单片机与STM32串口Printf打印实验
3.5节串口Printf打印实验 我们在上一节内容里使用了串口,但输出的数据是十六进制数据,难以阅读,在我们想使用串口打印调试信息时并不合适,在这种情况下,我们可以使用printf函数。 a.实验准备:USB转串口模块,ST-Llink下载器,CHEAPX机器人控制板 b.实验目的:使用STM32串口进行printf打印 c.相关知识点: printf函数的使用,主要需要学习输出格式,详情在程序中介绍。我们在必应或百度上输入搜索关键字“printf输出格式”,就可以获得很多相关介绍。 d.编程及运行 (1)基于3.5节串口收发实验的程序进行修改,增加如下函数,即能使用printf()函数。 //重定
[单片机]
《SLAM导航机器人基础》第三章:单片机与<font color='red'>STM32</font>:<font color='red'>串口</font>Printf打印实验
stm32学习笔记之串口通信
  在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。   b) 初始化函数定义:   void USART_Configuration(void); //定义串口初始化函数   c) 初始化函数调用:   void UART_Configuration(void); //串口初始化函数调用   初始化代码:   void USART_Configuration(void) //串口初始化函数   {   //串口参数初始化   USART_InitTypeDef USART_InitStructure; //串口设置恢复默认参数   //
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved