FreeRTOS | HAL_UART_Transmit阻塞问题与解决方法

发布时间:2026/10/12 3:04:33

FreeRTOS | HAL_UART_Transmit阻塞问题与解决方法 void Seria2_Printf(char *format, ...) { char String[200]; va_list arg; va_start(arg, format); vsprintf(String, format, arg); va_end(arg); HAL_UART_Transmit(huart2,(uint8_t*)String, strlen(String), HAL_MAX_DELAY); }在FreeRTOS中使用HAL_UART_Transmit函数时程序可能会卡住的原因通常与以下几个方面有关阻塞式调用HAL_UART_Transmit是一个阻塞式函数它会一直等待直到所有数据都发送完毕。在FreeRTOS中如果任务长时间阻塞可能会导致其他任务无法及时执行从而影响系统的实时性。优先级问题 如果当前任务的优先级较低而其他高优先级任务占用了CPU资源当前任务可能会长时间得不到执行看起来像是卡住了。UART硬件问题 如果UART硬件出现问题如波特率设置错误、硬件故障等HAL_UART_Transmit可能会一直等待数据发送完成导致程序卡住。缓冲区溢出 如果vsprintf生成的字符串长度超过了String数组的大小200字节可能会导致缓冲区溢出进而引发不可预知的行为包括程序卡住。中断处理 如果UART的中断处理不当可能会导致HAL_UART_Transmit无法正常完成。解决方案使用非阻塞式发送 可以使用HAL_UART_Transmit_IT或HAL_UART_Transmit_DMA等非阻塞式函数这样可以在数据发送的同时让任务继续执行其他操作。任务优先级调整 确保当前任务的优先级合理避免被其他高优先级任务长时间阻塞。检查硬件配置 确保UART的波特率、数据位、停止位等配置正确并且硬件工作正常。增加缓冲区大小 确保String数组足够大以避免缓冲区溢出。优化中断处理 确保UART的中断处理函数正确配置避免影响数据传输。示例代码使用非阻塞式发送void Seria2_Printf(char *format, ...) { char String[200]; va_list arg; va_start(arg, format); vsnprintf(String, sizeof(String), format, arg); // 使用vsnprintf防止缓冲区溢出 va_end(arg); HAL_UART_Transmit_IT(huart2, (uint8_t*)String, strlen(String)); // 使用非阻塞式发送 }void Seria2_Printf(char *format, ...) { va_list arg; va_start(arg, format); // 计算格式化字符串的长度 int len vsnprintf(NULL, 0, format, arg); if (len 0) { va_end(arg); return; // 格式化失败 } // 动态分配缓冲区 char *String (char *)malloc(len 1); // 1 用于字符串结束符 if (String NULL) { va_end(arg); return; // 内存分配失败 } // 格式化字符串 vsnprintf(String, len 1, format, arg); va_end(arg); // 使用非阻塞式发送 HAL_UART_Transmit_DMA(huart2, (uint8_t*)String, len); // 释放动态分配的内存 free(String); }遇到了一个奇葩问题啊嗯至今不知道是什么原因然后。通过开了一个软件定时发送串口程序就可以解决不能发送浮点数的一个问题。首先声明软件上能找到的设置的我都设置了并且耽搁了我两天时间我都差一点就整数拼接小数了最上面这个不发送浮点数就不会卡void MAIN_WUStartTask05(void *argument) { osTimerStart(WUTimer01Handle, 1000); while(1) { //DHT11_Read_Data(Temperature,Humidity);//读取温湿度。 //Data_Upload(); Usart_Control(); osDelay(100); } } void Callback01(void *argument) { LED_GREEN_TogglePin; Data_Upload(); // Seria2_Printf(WUA1:%s2:%s3:%s4:%s5:%s6:%d7:%d8:%d9:%d10:%.2f11:600.112:500.113:100.114:-10.515:70.116:-1700.117:0.018:-70.1219:130.120:2700.1521:70.122:80.123:nil24:ok\r\n,\ // Relay1,Relay2,Relay3,Relay4,Relay5,Temperature,Humidity,Temperature_max,T_alarm,Voltage);//继电器状态基本数据上传 }
延伸阅读

更多相关文章

2026/10/12 2:59:32

STM32驱动DS1302实时时钟:GPIO模拟时序与寄存器配置详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 2:59:32

虚拟电厂云端功率预测:坐标代替气象站,降本30%-50%

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 4:15:00

Java实现电商自动下单:接口层状态机、会话管理与避坑实战

简介:一个基于 Java 的京东自动下单工具,已在京东商城验证,面向双十一等促销活动需要快速抢购的用户,也适合想学习模拟登录、请求抓包、网页解析和自动化下单的 Java 开发者,还可作为二次开发的基础模板。压缩包共 33 …

2026/10/12 4:15:00

刚关门下架的小团队转头被苹果打包带走,背后的算盘藏不住了

刚关门下架的小团队转头被苹果打包带走,背后的算盘藏不住了 你可能很难想象,一家刚刚关门歇业、甚至把软件从各大应用商店下架删库的初创公司,转头就会被全球市值最高的科技巨头悄悄打包带走。 在布鲁塞尔欧盟委员会的一处公开监管备案数据库…

2026/10/12 4:15:00

SpringBoot+Vue陕西民俗网管理系统开发实践

一套基于SpringBootVue的陕西民俗网管理系统,用MyBatis做持久层、MySQL存数据,前后端分离,既能当毕业设计交差,也能真正跑起来做民俗文化展示和后台管理。这篇文章我会把项目从技术选型、数据库设计、核心功能实现,到部…

2026/10/12 4:15:00

兜里揣着千亿现金的苹果拟裁五千客服,机器接通后方案却被叫停

兜里揣着千亿现金的苹果拟裁五千客服,机器接通后方案却被叫停 如果你最近在美国或加拿大拨打过苹果的官方支持热线,接通那一刻,电话那头传来的很可能已经不是真人声音,而是一个能听懂日常口语、能分步骤教你排查手机故障的生成式人…

2026/10/12 4:10:00

100亿Token微调实战:从数据清洗到LoRA/QLoRA开源全流程

从立项到开源,这个项目整整花了我两个月时间,累计消耗的 Token 数超过了 100 亿。期间经历过数据质量不过关重来、训练中 loss 异常、评测结果不理想等多轮反复。这篇文章不打算只讲“我开源了一个模型”这样一个结果,而是把这套完整流程整理…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/11 0:02:13

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/11 0:02:13

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/12 0:04:22

绝缘子缺陷检测数据集清洗与工业级训练实战指南

简介:本资源是面向电力AI研发人员、工业视觉工程师及智能巡检系统开发者的绝缘子缺陷检测专用YOLO格式数据集,解决无人机航拍场景下绝缘子破损、污闪、积雪等9类典型缺陷的精准识别与定位难题。数据集共2139张真实巡检图像(含训练/验证/测试集…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑