stm32f4_奇怪的bug_串口数据错乱,一个串口收到另一个串口的数据

news2024/11/16 2:30:41

1、开发环境简介

芯片型号:stm32f407igt6

官方库函数:HAL库

2、bug现象描述和原因推测

使用了2个串口,一个是串口5-波特率115200,一个是串口4-波特率9600,但是串口4时不时会收到上一次发给串口5的数据。不是同一个串口,而且波特率都不一样,为什么呢?

原因推测:

a.应用层面代码错误,接收缓存共用了内存空间?

b.串口配置有误触发的内部混乱?

3、排除推测a

检查代码,各用各的缓存,没写错。

而且串口4是因为进入了接收中断,所以才收到数据,而这个中断标志位是stm32f4产生的。

串口4在实际没有收到数据的情况下,中断被触发了,并且收到了另一个串口,串口5的数据。

4、更改接收IO口的配置解决

4.1、HAL库手册提供的配置方式

完完全全按照要求配的,不行。

 

4.2、接收IO口上拉改为无上下拉

接收IO口上拉改为无上下拉,串口4就正常了。

因为是时不时出现,考虑可能只是降低bug复现概率,所以运行了一晚上,都是正常的,大概两万次吧,一次都没出现了,但是:

  • 官方要求是是要配置上拉的;
  • 从原理上说,串口空闲高电平,接收是应该上拉;
  • 还碰巧找到另一个人也遇到类似的问题,也是一个串口收到另一个串口数据,但是他是改成上拉之后解决的。

5、附串口配置代码

5.1、HAL库内部调用的MspInit

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	if(huart->Instance==HC05_USARTx){
		/* 串口外设时钟使能 */
		HC05_USARTx_RCC_CLK_ENABLE();	
		/* GPIO外设时钟使能 */
		HC05_USARTx_GPIO_ClK_ENABLE();					
		
		GPIO_InitStruct.Pin = HC05_USARTx_Tx_PIN;
		GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
		GPIO_InitStruct.Pull = GPIO_NOPULL;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
		GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
		HAL_GPIO_Init(HC05_USARTx_PORT, &GPIO_InitStruct);

		GPIO_InitStruct.Pin = HC05_USARTx_Rx_PIN;	
		GPIO_InitStruct.Pull = GPIO_NOPULL;		//成功
		//GPIO_InitStruct.Pull = GPIO_PULLUP;	//失败
		HAL_GPIO_Init(HC05_USARTx_PORT, &GPIO_InitStruct); 	
	
		/* USART1_IRQn interrupt configuration */
		HAL_NVIC_SetPriority(HC05_USART_IRQn, 1,0);
		HAL_NVIC_EnableIRQ(HC05_USART_IRQn);		
	}
}

5.2、外部的串口初始化函数

void HC05_USARTx_Init(void)
{	
	husartx_HC05.Instance = HC05_USARTx;
	husartx_HC05.Init.BaudRate = HC05_USARTx_BAUDRATE;
	husartx_HC05.Init.WordLength = UART_WORDLENGTH_8B;
	husartx_HC05.Init.StopBits = UART_STOPBITS_1;
	husartx_HC05.Init.Parity = UART_PARITY_NONE;		
	husartx_HC05.Init.Mode = UART_MODE_TX_RX;
	husartx_HC05.Init.HwFlowCtl = UART_HWCONTROL_NONE;
	husartx_HC05.Init.OverSampling = UART_OVERSAMPLING_16;
	HAL_UART_Init(&husartx_HC05);
	
	/* 配置串口中断并使能,需要放在HAL_UART_Init函数后执行修改才有效 */
	//__HAL_UART_CLEAR_FLAG(&husartx_HC05,USART_FLAG_IDLE); // 清除空闲中断标志
	__HAL_UART_ENABLE_IT(&husartx_HC05,UART_IT_IDLE);     // 使能空闲中断		
	__HAL_UART_ENABLE_IT(&husartx_HC05,UART_IT_RXNE);		//使能接收中断
}

看起来是解决了,但是不理解为什么,欢迎留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/985462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】 IP协议格式以及以太网帧结构

文章目录 IP协议格式以太网帧结构 IP协议格式 IP工作在网络层 IP头分为两部分,固定部分和可变部分,固定部分就是一定要带这些数据,正常存储应该是连续的,并不是像图中这样会换行,图中只是为了方便观察。 首先是一个版…

论数据库的种类

摘要 数据库是现代信息管理和数据存储的重要工具,几乎在各个领域都有广泛应用。不同类型的数据库适用于不同的应用场景和需求。本文将介绍几种常见的数据库种类,并探讨它们的特点和适用范围。 正文 一、关系型数据库(RDBMS) 关…

自定义封装异步任务组件,实现FutureTask功能

FutureTask 在 JDK1.8 后的异步编排API中的CompletableFuture&#xff0c;提供了 异步任务的成功回调、异常回调。 public class FutureTaskTest {public static void main(String[] args) throws Exception {CompletableFuture<String> future CompletableFuture.sup…

kodi的IPTV直播源爬取

安装了kodi的IPTV插件后&#xff0c;就能看电视&#xff0c;但是网上的直接源不太稳定。想起家里的有个魔百盒hm201是可以看电视和点播&#xff0c;就想通过爬取魔百盒里的直播源实现家里的打造自己基本稳定直播源&#xff0c;实现全屋的电视自由。 原文地址&#xff1a; IPTV直…

U-net网络学习记录

U-net网络 本质上是一个用于图像分割的神经网络 输入是一幅图&#xff0c;输出是目标的分割结果。继续简化就是&#xff0c;一幅图&#xff0c;编码&#xff0c;或者说降采样&#xff0c;然后解码&#xff0c;也就是升采样&#xff0c;然后输出一个分割结果。根据结果和真实分…

全球顶尖开源项目相聚外滩大会,绘制国际化开源生态新蓝图

在科技快速发展的当下&#xff0c;开放协作已成为技术创新的催化剂。在全球范围内&#xff0c;开源也是科技交流的永恒主题。 9月7日&#xff0c;2023外滩大会开源分论坛在上海举行。本次论坛由蚂蚁集团主办&#xff0c;以“打造国际化的开源开放创新生态”为主题&#xff0c;…

# 如何使用 GitHub Copilot 发送 Tweet(译)

文章目录 首先&#xff0c;什么是 GitHub Copilot为什么我使用GitHub Copilot 发送 Tweet&#xff1f;理由 1理由 2理由 3 它对你来说有什么价值&#xff1f;如何使用 Copilot 发送推文步骤一&#xff1a;注册 Twitter 开发者账户步骤二&#xff1a;在 Twitter 开发者平台创建应…

如何评估以及优化谷歌ads

在广告投放一段时间后&#xff0c;应该对广告的效果有所了解。如果您的目标是增加销量和网站流量&#xff0c;米贸搜谷歌推广建议请考虑以下问题&#xff1a; 1.哪些关键字为广告带来的点击最多&#xff1f; 2.客户进行搜索时使用的是何种设备&#xff1f;他们来自何处&#xf…

vue知识点————插槽 slot

slot 插槽 在父组件中引用的子组件 在父组件中写入百度 可在子组件slot插槽中展示出 父组件 <template><div id"app"><child url"https://www.baidu.com">百度</child></div> </template><script> import chil…

达梦控制台还原报错“管道失败”

达梦数据库控制台还原报错“管道失败” 环境 主机操作系统&#xff1a;windows10 profession 达梦数据库版本&#xff1a;达梦7 问题背景 全新安装达梦7数据库后&#xff0c;创建数据库实例&#xff0c;需要恢复往期bat备份。在控制台配置指定搜索目录后&#xff0c;获取备份时…

功率放大器在扫描显微镜中的应用有什么

功率放大器在扫描显微镜中起到了至关重要的作用。扫描显微镜是一种高分辨率的显微镜技术&#xff0c;它能够以极高的精度观察和研究样品的表面形貌和结构特征。而功率放大器则能够提供所需的信号增益&#xff0c;使得扫描显微镜能够获得更加清晰、细致的图像。 功率放大器可以帮…

TLS协议深度解析:挖掘现代网络安全防御的底层技术

正常简单的通讯 1、服务器生成一对密钥&#xff0c;公钥A、私钥A 2、浏览器请求服务器时&#xff0c;服务器把公钥A传给浏览器 3、浏览器随机生成一个对称加密的密码S&#xff0c;用公钥A加密后传给服务器 4、服务器接收后&#xff0c;用私钥A解密&#xff0c;得到密钥S 5、浏…

学习心得08:OpenGL

我是想学习一下如何编程&#xff0c;这本书大多介绍的是原理。这两个完全是一回事。所以我又买了另外一本看看。

【Apollo学习笔记】——规划模块TASK之PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER(二)

文章目录 TASK系列解析文章OptimizeByNLP1.get_nlp_info()定义问题规模2.get_bounds_info()定义约束边界约束3.get_starting_point()定义初值4.eval_f()求解目标函数5.eval_grad_f()求解梯度6.eval_g()求解约束函数7.eval_jac_g()求解约束雅可比矩阵8.eval_h()求解黑塞矩阵9. f…

2023年9月CDGA/CDGP数据治理认证考试报名,找弘博创新

据DAMA中国官方网站消息&#xff0c;2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启&#xff0c;相关事宜通知如下&#xff1a; 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…

四年级上册思维导图怎么绘制?简单漂亮绘制方法分享

四年级上册思维导图怎么绘制&#xff1f;思维导图是一种非常实用的工具&#xff0c;它可以帮助我们将复杂的想法和信息以图形化的方式呈现出来&#xff0c;让我们更加清晰地理解问题&#xff0c;并且更加容易地进行思考和决策。如果你需要绘制思维导图的话&#xff0c;那么今天…

抖店开通后要做的基础搭建,店铺快速起店的关键,建议认真看完

我是王路飞。 你是不是以为开通抖店之后&#xff0c;就没啥事了&#xff0c;可以直接选品上架了&#xff1f; 错了&#xff01; 在你选品上架之前&#xff0c;还有一步非常关键&#xff0c;就是店铺的基础搭建。 如果一些基础功能你没开通、设置没做好的话&#xff0c;是会…

C高级 第二天 shell指令

写一个1.sh脚本&#xff0c;将以下内容放到脚本中&#xff1a; 在家目录下创建目录文件&#xff0c;dir 在dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中 把当前目录下的的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz移动到dir1…

buuctf web 前5题

目录 一、[极客大挑战 2019]EasySQL 总结&#xff1a; 二、[极客大挑战 2019]Havefun 总结&#xff1a; 三、[HCTF 2018]WarmUp 总论&#xff1a; 四、[ACTF2020 新生赛]Include 总结&#xff1a; 五、[ACTF2020 新生赛]Exec 总结&#xff1a; 一、[极客大挑战 2019]…

leetcode897. 递增顺序搜索树(java)

递增顺序搜索树 题目描述中序遍历代码演示 递归专题 题目描述 难度 - 简单 LC - 897. 递增顺序搜索树 给你一棵二叉搜索树的 root &#xff0c;请你 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子…