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

【STM32】HAL库——串口中断只接收到两个字符

【STM32】HAL库——串口中断只接收到两个字符

  • 一、问题描述
  • 二、解决方法
  • 三、原因分析

一、问题描述

环境:STM32CubeMX(6.7.0)+MDK-ARM(V5.36.0.0)+STM32F103C8T6

使用XCOM发送字符串(总共8个字符),单片机进行解析为ModBus协议失败,只接收到前两个字节的数据。

二、解决方法

原串口中断回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1) //判断是哪个串口调用回调函数{if(modbus.reflag==1)     //有数据包正在处理{return;}modbus.rcbuf[modbus.recount++]=sbuf;printf("modbus.recount = %d, sbuf = %d\r\n", modbus.recount-1, sbuf);modbus.timout=0;if(modbus.recount ==1)  //收到主机发来的一帧数据的第一个字节{modbus.timrun=1;      //启动定时}}if(huart->Instance == USART2){}//重新使能串口接收中断HAL_UART_Receive_IT(&huart1, &sbuf, sizeof(sbuf));
}

去掉串口中断回调函数的printf函数即可

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1) //判断是哪个串口调用回调函数{if(modbus.reflag==1)     //有数据包正在处理{return;}modbus.rcbuf[modbus.recount++]=sbuf;modbus.timout=0;if(modbus.recount ==1)  //收到主机发来的一帧数据的第一个字节{modbus.timrun=1;      //启动定时}}if(huart->Instance == USART2){}//重新使能串口接收中断HAL_UART_Receive_IT(&huart1, &sbuf, sizeof(sbuf));
}

三、原因分析

在嵌入式系统中,将printf函数直接放在串口中断服务程序(ISR)中会导致一些问题,这是因为printf函数通常是一个比较复杂的函数,它需要执行多个指令,而在ISR中执行复杂的操作可能导致不可预测的行为和性能问题。以下是一些原因:

1.中断上下文的限制:中断服务程序在一个称为中断上下文的环境中执行。这个上下文可能与主程序上下文有很大不同,包括栈大小和运行时限制。printfi通常依赖于一些栈和堆内存,而在中断上下文中使用这些资源可能导致栈溢出或堆破坏。

2.原子性问题:在中断中执行printf可能会打破原子性要求,这意味着中断可能在中断服务程序运行期间被其他中断中断,这可能导致数据竞争和不一致的数据状态。

3.阻塞问题:pitf函数通常需要一些时间来完成,如果在中断中执行,可能会阻塞其他中断的处理。这可能导致严重的性能问题,特别是在高优先级中断和紧急任务的情况下。

为了在嵌入式系统中进行调试和输出信息,通常推荐使用轻量级的日志或缓冲机制,以便在中断中记录信息,然后在主程序上下文中将它们输出到串口。这可以确保不会出现上述问题,同时仍然允许你进行调试和数据记录。如果你需要在中断中快速记录数据,可以使用全局变量或环形缓冲区,然后在主程序上下文中定期检查并输出这些数据。

总之,在中断中执行prit通常是不建议的,因为它可能会引发各种问题,包括性能问题和数据不一致。最好的做法是在中断中尽量保持操作的简单和快速,将复杂的操作和输出留给主程序上下文。

相关文章:

【STM32】HAL库——串口中断只接收到两个字符

【STM32】HAL库——串口中断只接收到两个字符 一、问题描述二、解决方法三、原因分析 一、问题描述 环境:STM32CubeMX(6.7.0)MDK-ARM(V5.36.0.0)STM32F103C8T6 使用XCOM发送字符串(总共8个字符),单片机进行解析为ModBus协议失败…...

页面html结构导出为word或pdf

一、使用场景和原理 需要将当前页面(一般详情页面)或者dom容器中的内容保存/截图,并且导出为word或者pdf 导出word:获取dom结构直接转化为word导出 导出pdf:用canvas生成当前页面或者dom范围的快照,参考截图功能,然后将生成的canvas转为pdf内…...

Object.prototype.toString.call() 和 instanceOf 和 Array.isArray() 详解

解析: 理解 Object.prototype.toString.call(), instanceof, 和 Array.isArray() 是 JavaScript 中重要的类型检查工具。以下是一个较为详细的解释和示例代码,帮助你理解它们的工作原理和使用场景 Object.prototype.toString.call(): Object.prototyp…...

自学(黑客技术)方法——网络安全

如果你想自学网络安全,首先你必须了解什么是网络安全!,什么是黑客!! 1.无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如 Web 安全技术,既有 Web 渗透2.也有 Web 防…...

CVE-2023-46227 Apache inlong JDBC URL反序列化漏洞

项目介绍 Apache InLong(应龙)是一站式、全场景的海量数据集成框架,同时支持数据接入、数据同步和数据订阅,提供自动、安全、可靠和高性能的数据传输能力,方便业务构建基于流式的数据分析、建模和应用。 项目地址 h…...

MySQL几种方法的数据库备份

MySQL几种方法的数据库备份_mysql备份的几种方式-CSDN博客 MySQL有几个方法来备份 最近博客一直想写点。可是不知道写什么,感觉自己近期的知识没有什么添加,今天想到了一篇能够写的博客。曾经试过依据data目录备份MySQL。可是从来没有成功过。前几天帮助…...

CI/CD:GitLab-CI 自动化集成/部署 JAVA微服务的应用合集

CI/CD:GitLab-CI 自动化集成/部署 JAVA微服务的应用合集 CI/CD:GitLab-CI 自动化集成/部署 JAVA微服务的应用合集安装DockerGitLabGitLab-Runner阿里云容器仓库 GitLab-CIJava微服务的GitLab-CI应用 CI/CD:GitLab-CI 自动化集成/部署 JAVA微服…...

Flask 上传文件,requests通过接口上传文件

这是一个使用 Flask 框架实现文件上传功能的示例代码。该代码定义了两个路由: /upload:处理文件上传请求。在该路由中,我们首先从请求中获取上传的文件,然后将文件保存到本地磁盘上,并返回一个字符串表示上传成功。 /…...

kvm webvirtcloud 如何添加直通物理机的 USB 启动U盘

第一步:查看USB设备ID 在物理机上输入 lsusb 命令 rootubuntu:/media/usb1# lsusb Bus 002 Device 002: ID 0781:5581 SanDisk Corp. Ultra Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 0424:2514 Microchip Technolo…...

html- a标签包裹img标签, 点击图片无法跳转问题记录及解决方法

html- a标签包裹img标签, 点击图片无法跳转问题记录及解决方法 首先明确我们的目标, 就是a标签包裹的内容, 都能点击后以后直接跳转 可以通过更改html结构和css解决: <div v-for"(item, index) in newsData" :key"index" class"flexcol">&…...

Halcon转OpenCV实例--保险丝颜色识别(附源码)

导 读 本文主要介绍Halcon转OpenCV实例--保险丝颜色识别(附源码)。 实例来源 实例来源于Halcon例程color_fuses.hdev--classify fuses by color 下面是Halcon实例代码和实现效果: * color_fuses.hdev: classify fuses by colordev_update_window (off)* ***** step: set up …...

制造业中的微小缺陷检测——应用场景分析与算法选择(YoloV8/CANet)

一、缺陷检测任务 缺陷检测的任务通常可以分为三个主要阶段&#xff0c;包括缺陷分类、缺陷定位和缺陷分割。 1.缺陷分类 缺陷分类是检测过程的第一步&#xff0c;目的是将检测到的缺陷区域分类为不同的类别&#xff0c;通常是根据缺陷的性质或类型进行分类。分类的类别包括…...

支持多校 微信课表小程序源码 排课小程序源码 支持导入课表 情侣课表 背景设置

练手Lab课程表小程序源码是一个基于thinkphp系统进行开发的前后端分离系统。 源码功能介绍 1、情侣功能 2、情侣间留言 3、情侣间互相设置课程表背景 4、自己日、周课程表背景设置 5、教务系统课程表导入 6、导入别人分享的课表 7、导入别人分享的单课 8、多校支持 9…...

谷歌计划从Chrome119起测试IP隐私保护功能

目前&#xff0c;谷歌正为Chrome浏览器测试一项新的“IP保护”功能。因为该公司认为用户IP地址一旦被黑客滥用或秘密跟踪&#xff0c;都可能导致用户隐私信息泄露。 而这项功能可通过代理服务器屏蔽用户的IP地址&#xff0c;以增强用户的隐私性&#xff0c;这样就可以尽量在确…...

【技能树笔记】网络篇——练习题解析(九)

目录 前言 一、OSPF双栈 1.1 OSPFv3 LSA 1.2 OSPFv3 二、ISIS双栈 2.1 ISISv6 2.2 ISIS高级特性 三、BGP双栈 四、PIM双栈 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filot…...

c++ qt连接操作sqlite

qt客户端编程,用到数据库的场景不多,但是部分项目还是需要数据库来保存同步数据,客户端用到的数据库,一般是sqlite。 Qt提供了数据库模块,但是qt本身的数据库模块并不好用,会有各种问题, 建议大家不要,可以自己封装数据库的操作。本篇博客介绍qt连接操作sqlite。 sqlit…...

Qt之自定义QStringListModel设置背景色和前景色

一.效果 二.实现 QStringListModel里只实现了Qt::EditRole和Qt::DisplayRole,不能直接设置背景色和前景色,所以我们要继承QStringListModel,重写其中的data和setData方法,使其支持Qt::ForegroundRole和Qt::BackgroundRole。 QHStringListModel.h #ifndef QHSTRINGLISTMO…...

人工智能基础_机器学习001_线性回归_多元线性回归_最优解_基本概念_有监督机器学习_jupyter notebook---人工智能工作笔记0040

线性和回归,就是自然规律,比如人类是身高趋于某个值的概率最大,回归就是通过数学方法找到事物的规律. 机器学习作用: 该专业实际应用于机器视觉、指纹识别、人脸识别、视网膜识别、虹膜识别、掌纹识别、专家系统、自动规划、智能搜索、定理证明、博弈、自动程序设计、智能控制…...

Linux 错误处理(字符设备基础三)

在Linux字符设备驱动中&#xff0c;即使是最简单的注册字符设备&#xff0c;也存在注册失败的可能性&#xff0c;因此在之前编写的驱动代码中采用检查函数返回值的方式&#xff0c;确认函数是否成功执行 一、goto 语句 在编写驱动程序时&#xff0c;驱动程序应该提供函数执行失…...

STM32 PWM配置及呼吸灯

PWM的英文全称是"Pulse Width Modulation"&#xff0c;中文翻译为"脉冲宽度调制"。 在PWM中可以调节的其实只有两个东西&#xff0c;一个叫做可调周期&#xff08;调频率&#xff09;&#xff0c;另一个叫做占空比&#xff08;高电平/周期&#xff09;。 而…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...