当前位置: 首页 > news >正文

【Bug】STM32串口空闲中断接收不定长数据异常

Bug

使用标准库配置STM32F103C8T6的串口1开启接收中断和空闲中断,通过空闲中断来判断数据发送是否结束,收到数据后切换板载LED灯所接引脚电平,发现LED出现三种情况,熄灭、微亮、正常亮,但是LED灯所接的GPIO引脚为PC13,配置PC13时为推挽输出模式,应该只有高低也就是亮灭两种情况,却出现了微亮的现象,具体串口代码配置如下:

static void USART1_NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void USART1_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;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);USART1_NVIC_Configuration();USART_ITConfig(USART1, USART_IT_RXNE | USART_IT_IDLE, ENABLE);	USART_Cmd(USART1, ENABLE);	    
}volatile u8 USART1_BUF[200] = {0};
volatile u8 USART1_BUF_LEN = 0;
volatile u8 USART1_REC_FLAG = 0;
void USART1_IRQHandler(void)
{static u8 res = 0;if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET){res = USART_ReceiveData(USART1);if(USART1_BUF_LEN < 200)USART1_BUF[USART1_BUF_LEN++] = res;USART_ClearITPendingBit(USART1,USART_IT_RXNE);	} if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET){LED_Trig();			//切换LED灯电平状态函数memset((void*)USART1_BUF,0,USART1_BUF_LEN);USART_ClearITPendingBit(USART1,USART_IT_IDLE);	}
}

LED灯所接GPIO引脚配置函数:

void LED_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);
}void LED_Trig(void)
{static u8 led = 0;if(led == 0){GPIO_ResetBits(GPIOC,GPIO_Pin_13);led = 1;}else{                    GPIO_SetBits(GPIOC,GPIO_Pin_13);led = 0;}
}

Reason 1

通过Debug发现空闲中断并未进去,查看了串口1的配置寄存器发现空闲中断并未使能,而空闲中断的使能只有一条函数 USART_ITConfig(USART1, USART_IT_RXNE | USART_IT_IDLE, ENABLE); ,在仔细查看了该函数后发现,不能通过与运算来同时开启两个中断使能,因为该宏并不是以往像GPIO驱动一样,通过每个位来控制,就能直接通过与运算包含进去直接配置,每个宏的值都是单独的:

#define USART_IT_PE                          ((uint16_t)0x0028)
#define USART_IT_TXE                         ((uint16_t)0x0727)
#define USART_IT_TC                          ((uint16_t)0x0626)
#define USART_IT_RXNE                        ((uint16_t)0x0525)
#define USART_IT_ORE_RX                      ((uint16_t)0x0325) /* In case interrupt is generated if the RXNEIE bit is set */
#define USART_IT_IDLE                        ((uint16_t)0x0424)
#define USART_IT_LBD                         ((uint16_t)0x0846)
#define USART_IT_CTS                         ((uint16_t)0x096A)
#define USART_IT_ERR                         ((uint16_t)0x0060)
#define USART_IT_ORE_ER                      ((uint16_t)0x0360) /* In case interrupt is generated if the EIE bit is set */
#define USART_IT_NE                          ((uint16_t)0x0260)
#define USART_IT_FE                          ((uint16_t)0x0160)

Resolution 1

因此需要分开进行中断使能,正确的中断使能应该是分开调用使能函数进行:

	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);	

Reason 2

第二个情况,LED灯出现三种亮灭状态的异常情况,明明只是配置成普通的GPIO引脚,却出现微亮的情况,说明程序出现了异常现象,然后再网上偶然看到一个空闲中断中读取串口数据的,在空闲中断中也加入了串口的接收数据读取程序就又正常了,一开始以为空闲中断没有数据需要读取所以就没有调用读取函数了,没想到会异常在这里,具体的原因还未知,怀疑是因为没有去读取数据导致中断异常,同时我也发现了串口中断中必须去读取数据,不管数据有用无用,或者是担心保存数据的缓冲区溢出而加入了长度限制或者是其他操作标志位限制而不去读取数据,都会导致这种情况,所以无论什么情况都要去读取串口接收数据,也就是调用USART_ReceiveData()函数。


Resolution 2

在串口中断中,无论是接收中断还是空闲中断,都要去读取串口数据:


volatile u8 USART1_BUF[200] = {0};
volatile u8 USART1_BUF_LEN = 0;
volatile u8 USART1_REC_FLAG = 0;
void USART1_IRQHandler(void)
{static u8 res = 0;if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET){res = USART_ReceiveData(USART1);if(USART1_BUF_LEN < 200)USART1_BUF[USART1_BUF_LEN++] = res;USART_ClearITPendingBit(USART1,USART_IT_RXNE);	} if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET){USART_ReceiveData(USART1);	//一定要读LED_Trig();memset((void*)USART1_BUF,0,USART1_BUF_LEN);USART_ClearITPendingBit(USART1,USART_IT_IDLE);	}
}

同时,程序也验证了串口的空闲中断能够接收数据不定长的情况,至于如何判断数据是否结束,主要通过起始位后如果全是1,说明没有数据进入,那么在差不多两三个字节都是全1就会认为数据已经发送结束产生空闲中断。

相关文章:

【Bug】STM32串口空闲中断接收不定长数据异常

Bug 使用标准库配置STM32F103C8T6的串口1开启接收中断和空闲中断&#xff0c;通过空闲中断来判断数据发送是否结束&#xff0c;收到数据后切换板载LED灯所接引脚电平&#xff0c;发现LED出现三种情况&#xff0c;熄灭、微亮、正常亮&#xff0c;但是LED灯所接的GPIO引脚为PC13…...

使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题

一、项目简介 使用过ABP框架的童鞋应该知道它也自带了一款免费的Blazor UI主题&#xff0c;它的页面是长这样的&#xff1a; 个人感觉不太美观&#xff0c;于是网上搜了很多Blazor开源组件库&#xff0c;发现有一款样式非常不错的组件库&#xff0c;名叫&#xff1a;Radzen&am…...

Java入门4——输入输出+实用的函数

在本篇博客&#xff0c;采用代码解释的方法&#xff0c;帮助大家熟悉Java的语法 一、输入和输出 在Java当中&#xff0c;我们一般有这样输入输出&#xff1a; import java.util.Scanner;public class javaSchool {public static void main(String[] args) {Scanner scanner …...

《当尼采哭泣》

这是一个相互救赎的故事。故事铺垫比较冗长&#xff0c;看到一半的时候一度看不下去。直到看到最后两章才最终感觉值得一看。很多表层现象&#xff0c;就像露出水面的冰山。解决表面的问题&#xff0c;需要深挖冰山水下的部分。一个人碰到的最难解决的问题不在外部&#xff0c;…...

TOMCAT Using CATALINA——OPTS,闪退解决方法(两种)

【Java实践】安装tomcat启动startup.bat出现闪退问题_安装tomcat点击startup闪退-CSDN博客...

Android音视频 MediaCodec框架-启动编码(4)

Android音视频 MediaCodec框架-启动编码 简述 上一节我们介绍了MediaCodec框架创建编码器流程&#xff0c;编解码的流程其实基本是一样的&#xff0c;只是底层的最终的实现组件不同&#xff0c;所以我们只看启动编码流程。 MediaCodec启动编码 从MediaCodec的start方法开始…...

# Go 语言中的 Interface 和 Struct

go package mainimport ("fmt" )// Girl 是一个接口&#xff0c;定义了所有"女性"类型都应该实现的方法 type Girl interface {call()introduce() }// Wife 结构体代表妻子 type wife struct {name stringage intyearsWed int }// call 方法…...

SSM与Springboot是什么关系? -----区别与联系

SSM&#xff08;Spring Spring MVC MyBatis&#xff09;和 Spring Boot 都是基于 Spring 框架的技术栈&#xff0c;但它们在使用方式、配置复杂度以及设计理念上有所不同。下面是 SSM 和 Spring Boot 之间的关系及主要区别&#xff1a; SSM (Spring Spring MVC MyBatis) 定…...

MATLAB小波变换图像融合系统

二、应用背景及意义 本课题利用小波变换进行图像的融合&#xff0c;然后对融合的结果进行图像质量的评价。所谓小波变换图像融合就是对多个的信息目标进行一系列的图像提取和合成&#xff0c;进而可以获得对同一个信息目标的更为精确、全面、可靠的高低频图像信息描述。并且也…...

nginx-安装和80端口映射多域名和ssl

一、安装所需插件 1、安装 gcc gcc是linux下的编译器&#xff0c;它可以编译 C,C,Ada,Object C和Java等语言。 yum -y install gcc 2、安装pcre、pcre-devel pcre是一个perl库&#xff0c;包括perl兼容的正则表达式库&#xff0c;nginx的http模块使用pcre来解析 正则表达式。…...

SVN小乌龟 create patch 和 apply patch 功能

在SVN&#xff08;Subversion&#xff09;版本控制系统中&#xff0c;使用“小乌龟”&#xff08;TortoiseSVN&#xff09;这个图形界面工具可以极大地简化SVN操作。TortoiseSVN中的“create patch”和“apply patch”是两个非常有用的功能&#xff0c;它们与版本控制中的补丁&…...

#MySQL `SELECT` 语句执行流程详解

在数据库操作中&#xff0c;MySQL 的 SELECT 语句是用于查询数据最常见的 SQL 语句之一。理解它的执行流程对数据库优化和性能提升具有至关重要的意义。本文将详细解析 SELECT 语句从发出请求到返回结果的每个步骤&#xff0c;并结合 MySQL 的架构为您提供深度理解。 ## 1. 连接…...

docker容器运行一段时间提示Failed to initialize NVML: Unknown Error

情况描述 服务器使用docker启动容器。启动以后一切正常也能跑程序。但是&#xff0c;在运行一段时间&#xff08;2天左右不等&#xff09;&#xff0c;会发现gpu掉了。输入nvidia-smi提示 Failed to initialize NVML: Unknown Error 主要发生条件是&#xff0c;docker启动的…...

PPT自动化:快速更换PPT图片(如何保留原图片样式等参数更换图片)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 PPT更换图片 📒1. 安装 `python-pptx` 模块2. 加载PPT文件3. 查找并替换图片3.1 查找图片形状3.2 获取原图片的样式和位置3.3 替换图片4. 保存修改后的PPT文件5. 设置图片的相关参数5.1 设置透明度5.2 设置边框🚀 保留所有参…...

秒懂MVC, MVP, MVVM框架

框架的目标 关注点分离 (separation of concerns)低耦合 (Loose coupling)容易维护 (Maintainable)容易被测试 (Testable)...

IDEA社区版如何用tomcat运行war包

前言 我们在使用IDEA开发Java应用时&#xff0c;有时候需要运行的不是jar包&#xff0c;而是war包&#xff0c;但IDEA社区版默认是不支持tomcat容器的&#xff0c;无法直接运行war包。不过好在我们有一个强大的插件来支持我们使用tomcat&#xff0c;那么&#xff0c;我们应该如…...

如何使用 Git Cherry-Pick 和 Reset 处理误提交,并确保安全回滚

在开发过程中&#xff0c;偶尔会遇到不小心将功能开发提交到错误分支上的情况。假设我们计划在 10 月 24 号上线某些功能&#xff0c;但却不小心在 10 月 17 号的上线分支上进行了开发。为了解决这个问题并将误提交的内容移到正确的分支上&#xff0c;我们可以借助 Git 的一些功…...

Goland 搭建Gin脚手架

一、使用编辑器goland 搭建gin 打开编辑器 新建项目后 点击 create 二、获得Gin框架的代码 命令行安装 go get -u github.com/gin-gonic/gin 如果安装不上&#xff0c;配置一下环境 下载完成 官网git上下载 这样就下载完成了。、 不过这种方法需要设置一下GOPATH 然后再执…...

Java Spring的高级装配

1.profile与bean 1.1 profile 如果我们在配置类中装配一个bean&#xff0c;但是这个bean与环境相关怎么办&#xff1f; 比如有一个类&#xff0c;它在开发环境采取一种模式&#xff0c;但是到了生产环境&#xff0c;有需要使用另一种环境。 当然&#xff0c;你可能会说&…...

分布式光伏发电系统电气一次部分设计(开题报告2)

毕业论文(设计)开题报告 题目 分布式光伏发电系统电气一次部分设计 题目类别 毕业设计 姓名 专业 班级 学号 一、选题背景及依据(简述国内外研究状况和相关领域中已有的研究成果(文献综述),选题目的、意义,列出主要参考文献) (一)选题背景与依据 选题背景与依据: …...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...