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

STM32printf重定向到串口含armcc和gcc两种方案

STM32串口重定向:MDK与GCC环境下需重写的函数差异

在嵌入式开发中,尤其是使用 STM32系列微控制器 的项目中,调试信息的输出是不可或缺的一部分。为了方便调试,开发者通常会选择将 printf 等标准输出函数通过 UART 串口发送到 PC 端进行查看和分析。

然而,在不同的编译器环境中(如 MDK(Keil)GCC),实现标准输出函数重定向的方式存在差异。本文将详细介绍如何在这两种环境下完成串口重定向,并指出它们之间需要重写的函数区别。


✅ 一、重定向的基本原理

无论是在 MDK 还是 GCC 编译环境下,串口重定向的核心思想都是通过重写底层的字符输出函数,使得标准库中的 printf 系列函数能够通过串口发送数据。

标准 C 库中的 printf 函数最终会调用底层的字符输出函数,而不同编译器对这些底层函数的命名和接口定义略有不同。因此,开发者需要根据所使用的编译器环境,选择并实现对应的函数。


🛠️ 二、在不同编译器下的实现方法

1. Keil MDK 环境(ARMCC / AC6)

Keil MDK 中,标准输入输出函数依赖于 ARM 自带的 C 标准库。要重定向 printf,需要重写 _sys_write() 或者更常用的 fputc() 函数。

// Keil MDK 下的标准重定向函数
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);return ch;
}

或者使用传统的:

int fputc(int ch, FILE *f)
{HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);return ch;
}

⚠️ 注意:如果使用的是 ARM Compiler 6(即基于 LLVM 的编译器),建议优先使用 __io_putchar()


2. GCC 编译器环境(适用于 STM32CubeIDE、Makefile + arm-none-eabi-gcc)

在 GCC 环境下,标准输出函数依赖于新lib库(newlib-nano)。此时需要实现 _write() 函数来捕捉 write() 调用,从而完成串口输出。

// GCC 下的重定向函数
int _write(int fd, char *ptr, int len)
{HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);return len;
}

该函数接收文件描述符 fd(通常我们忽略它)、指向字符串的指针 ptr,以及长度 len,然后将整个缓冲区通过串口发送出去。


🔁 三、统一方式:使用宏定义简化适配

为了兼容不同编译器,可以使用预处理器宏定义统一代码风格,避免重复编写两个版本。

// 通用重定向头文件或代码段
#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endifPUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);return ch;
}// GCC 特定部分
#ifdef __GNUC__
int _write(int fd, char *ptr, int len)
{HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);return len;
}
#endif

这样处理后,只需切换编译器即可自动适配对应函数,提高代码复用性和可维护性。


💡 四、注意事项

  • 串口句柄:确保 &huart1 已被正确初始化并在全局作用域中可用。
  • 阻塞问题HAL_UART_Transmit() 是阻塞函数,若用于中断上下文或实时性强的场景,请改用非阻塞方式(如DMA或中断发送)。
  • 性能优化:频繁调用 printf() 可能影响性能,建议仅用于调试阶段。
  • 重定向范围:除了输出,还可以重定向输入(如 scanf),但需重写对应的 _read()fgetc()

📌 五、总结

编译器需重写的函数函数原型
MDK(Keil)fputc / __io_putcharint fputc(int ch, FILE *f) / int __io_putchar(int ch)
GCC_writeint _write(int fd, char *ptr, int len)

通过以上方式,我们可以灵活地在 STM32 开发中实现串口重定向,为调试提供极大的便利。


📚 参考资料

  • CSDN 博客 - 原文链接
  • ST官方 HAL 库文档
  • GCC 新版标准库(newlib-nano)说明文档

📢 如您发现任何错误或有改进建议,欢迎留言交流!


版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请注明出处并保留原文链接。


相关文章:

STM32printf重定向到串口含armcc和gcc两种方案

STM32串口重定向:MDK与GCC环境下需重写的函数差异 在嵌入式开发中,尤其是使用 STM32系列微控制器 的项目中,调试信息的输出是不可或缺的一部分。为了方便调试,开发者通常会选择将 printf 等标准输出函数通过 UART 串口发送到 PC …...

蓝桥杯 序列计数

序列计数 原题目链接 题目描述 小明想知道,满足以下条件的正整数序列的数量: 第一项为 n;第二项不超过 n;从第三项开始,每一项小于前两项的差的绝对值。 请计算,对于给定的 n,有多少种满足…...

CSS常用属性_(进阶)

目录 1.尺寸单位与颜色 (1)尺寸 (2)颜色 常用2种 (3)颜色属性值(透明度) 例如: 2.字体属性font 例如: **顺序 3.文本属性 ​编辑例如: …...

模拟频谱分析仪(Linux c++ Qt)

此Demo由三个小项目组成,分布是模拟的硬件采集频谱数据端,后台处理端以及qt前端,于Linux系统下进行开发,使用的软件为clion和QtCreator,编程语言为c,使用了linux下的boost库(1.72),多线程和TCP,UDP以及c的一些新特性,为本人自己想的练手的小项目. 1.项目架构 整体设计采集端不…...

从实列中学习linux shell5: 利用shell 脚本 检测硬盘空间容量,当使用量达到80%的时候 发送邮件

下面是用于检测硬盘空间并在使用量达到80%时发送邮件的Shell脚本 第一步 编写脚本 #!/bin/bash# 邮件配置 recipient"zhaoqingyou99qhzt.com" subject"磁盘空间警报" mail_cmd"/usr/bin/mail" # 根据实际邮件命令路径修改# 检查是否安装邮件工…...

NLP 分词技术学习

文章目录 分词1. 分词方法2. 分词工具3. 分词难点 分词 分词是将连续的中文字符串序列切分成有意义的词语序列的过程,是 NLP 的基础任务之一。需要掌握以下内容: 1. 分词方法 基于规则/词典的方法(字符串匹配): 正向…...

大模型——使用 StarRocks 作为向量数据库

大模型——使用 StarRocks 作为向量数据库 本章节介绍了 StarRocks,这是一款高性能的分析数据库,并演示了如何将其用作向量数据库。内容涵盖了设置、文档加载、标记化、创建向量数据库实例以及构建一个能够检索的问答系统。 StarRocks StarRocks 是一个次世代的亚秒级 MPP…...

涨薪技术|0到1学会性能测试第44课-apachetop模块监控

前面的推文我们认识了apache目录结构与配置知识,今天我们继续来看下apache监控技术,究竟是怎么做性能监控???后续文章都会系统分享干货,带大家从0到1学会性能测试。 Apache监控技术 关于apache监控通常会有两种方法: 一是&…...

MySQL 基本查询(一)

文章目录 Create(insert)指定列的单行插入和全列插入多行全列插入和指定列的多行插入如果主键存在,要插入替换存在的值replace 基本select全列查询指定列查询where子句where子句案例语文成绩在 [80, 90] 分的同学及语文成绩数学成绩是 58 或者 59 或者 98 或者 99 分…...

Chrome 136 H265 WebRTC 支持 正式版本已包含

时间过的真快,去年8月份写过一篇文章介绍如何加参数方式启动Chrome H265 硬件解码器, 现在的136版本已经包含在内,至此WebRTC已经完整包含了H264和H265解码器,这个事情应该从2015年开始,Google强推VP9 AV1&#xff0c…...

涨薪技术|0到1学会性能测试第43课-apache status模块监控

前面的推文我们认识了apache目录结构与配置知识,今天我们继续来看下apache监控技术,究竟是怎么做性能监控的。后续文章都会系统分享干货,带大家从0到1学会性能测试。 Apache监控技术 关于apache监控通常会有两种方法: 一是:使用apache自带的status监控模块进行监控; 二是…...

一、Javaweb是什么?

1.1 客户端与服务端 客户端 :用于与用户进行交互,接受用户的输入或操作,且展示服务器端的数据以及向服务器传递数据。 例如:手机app,微信小程序、浏览器… 服务端 :与客户端进行交互,接受客户…...

研发效率破局之道阅读总结(4)个人效率

研发效率破局之道阅读总结(4)个人效率 Author: Once Day Date: 2025年4月30日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...

word模板填充导出-(支持word导出、pdf导出)

word模板填充转pdf导出处理 关于word模板填充示例java根据word模板填充数据并导出-五官一体即忢 相关依赖插件【LibreOffice】 安装 LibreOffice:从LibreOffice 官方网站下载并安装适合 Windows 系统或者Linux系统的版本 启动 LibreOffice 服务:打开…...

【Kubernets知识】Secret组件更新大全

文章目录 Kubernetes Secret 更新机制详解及场景指南一、直接替换式更新(全量覆盖)操作命令特点适用场景风险提示 二、JSON Patch 精准更新操作命令特点适用场景示例流程 三、Strategic Merge Patch(策略合并)操作命令特点适用场景…...

《分词算法大揭秘:BPE、BBPE、WordPiece、ULM常见方法介绍》

分词算法是自然语言处理(NLP)中的一个重要预处理步骤,它将文本分割成更小的单元(如单词、子词或字符)。以下是几种常见的分词算法:Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram…...

MySQL RR (Repeatable Read) 隔离级别规则细节

准备 测试表: CREATE TABLE transaction_test (id int,value int,mtime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (id) ) ENGINE InnoDB;mysql设置: transaction_isolation REPEATABLE-READ auto…...

iOS HTTPS 抓包踩坑记:几种方案尝试与替代工具记录

iOS HTTPS 抓包踩坑记:几种方案尝试与替代工具记录 最近负责一个 iOS App 的调试任务,遇到了 HTTPS 接口抓包难题,顺手做个记录,顺带分享一些试过的工具和方案。 背景 这个 App 启用了 HTTPS 双向认证和证书 pinning&#xff0…...

第十一节:Shell脚本编程

理论知识 Shell 脚本的基本概念:Shell 脚本是一种为 shell 编写的脚本程序,它可以将一系列的命令组合在一起,实现自动化任务。Shell 脚本通常以 .sh 为扩展名。Shell 脚本的执行方式:可以将 Shell 脚本作为可执行程序执行&#x…...

Electron Forge【实战】带图片的 AI 聊天

改用支持图片的 AI 模型 qwen-turbo 仅支持文字,要想体验图片聊天,需改用 qwen-vl-plus src/initData.ts {id: 2,name: "aliyun",title: "阿里 -- 通义千问",desc: "阿里百炼 -- 通义千问",// https://help.aliyun.com/z…...

Learning vtkjs之OutlineFilter

过滤器 外轮廓包围盒生成 介绍 vtkOutlineFilter - 一个为较大单元生成三角形的过滤器 vtkOutlineFilter 是一个将具有三个以上点的单元转换为三角形的过滤器。 感觉就是一个包围盒生成的算法,而且试用下来,只能支持一个InputConnection 效果 核心逻…...

腾讯云CodeBuddy初体验

我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴”; 最近AI编程很火,据说我司程序员现在每天可以准点下班,AI起到了很大的作…...

加速LLM大模型推理,KV缓存技术详解与PyTorch实现

随着大型语言模型(LLM)规模和复杂度的指数级增长,推理效率已成为人工智能领域亟待解决的关键挑战。当前,GPT-4、Claude 3和Llama 3等大模型虽然表现出强大的理解与生成能力,但其自回归解码过程中的计算冗余问题依然显著制约着实际应用场景中的…...

江西省电价新政发布!微电网源网荷储充一体化平台重塑企业能源格局!

一. 江西省发改委发布发布 4月25日,江西省发改委发布关于公开征求《关于进一步完善分时电价机制有关事项的通知(征求意见稿)》意见的公告。征求意见提出: 江西省:中午3小时谷段电价,电价下浮60%~70% 除1…...

深夜突发:OpenAI紧急修复GPT-4o“献媚”问题

凌晨三点,OpenAI首席执行官Sam Altman发布官方声明,宣布针对GPT-4o的“献媚”问题展开紧急修复。这场突如其来的技术风波,源于近期大量用户对模型行为模式的不满。许多用户发现,当他们向GPT-4o提出类似“你觉得我怎么样”或“如果…...

Webpack 和 Vite 中静态资源动态加载的实现原理与方法详解

静态资源动态加载 需求背景:现在需要加载指定文件夹下的对应图片,需要根据用户选的参数自动加载对应图片 一、前言:模块化开发的演进需求 在现代前端工程中,随着SPA应用复杂度的提升,静态资源动态加载已成为优化首屏性…...

SMMU相关知识

1. 使用smmu的作用 支持具有DMA能力设备的虚拟化实现解决32位系统访问超过4G空间的地址解决系统动态分配大块连续内存 2. 为什么需要使用2级页表 SMMU(系统内存管理单元)采用二级页表架构的核心原因可归结为地址空间管理效率、内存资源优化以及虚拟化…...

2025年数字创意设计与图像处理国际会议 (DCDIP 2025)

2025 International Conference on Digital Creative Design and Image Processing 【一】、大会信息 会议简称:DCDIP 2025 大会地点:中国济南 收录检索:提交Ei Compendex,CPCI,CNKI,Google Scholar等 【二…...

39.RocketMQ高性能核心原理与源码架构剖析

1. 源码环境搭建 1.1 主要功能模块 ​ RocketMQ的官方Git仓库地址:GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. ​ RocketMQ的官方网站上下载指定版…...

SVTAV1 编码函数 svt_aom_is_pic_skipped

一 函数解释 1.1 svt_aom_is_pic_skipped函数的作用是判断当前图片是否可以跳过编码处理。 具体分析如下 函数逻辑 参数说明:函数接收一个指向图片父控制集的指针PictureParentControlSet *pcs, 通过这个指针可以获取与图片相关的各种信息,用于判断是否跳…...

C++负载均衡远程调用学习之基础TCP服务

目录 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 3.LARS的reactor框架的组成部分 4.Lars_reactor的项目目录构建 5.Lars_tcp_server的基础服务开发 6.Lars_tcp_server的accept实现 7.LarsV0.1总结 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 # Lars系统开发 …...

WebRtc09:网络基础P2P/STUN/TURN/ICE

网络传输基本知识 NATSTUN(Session Traversal Utilities for NAT)TURNICE NAT 产生的原因 IPV4地址不够出于网络安全的原因 NAT种类 完全锥型NAT(Full Cone NAT)地址限制型NAT(Address Restricted Cone NAT)端口限制型NAT(Port Restricted Cone NAT…...

UDP/TCP协议知识及相关机制

一.UDP协议 UDP是一种无连接、不可靠、面向报文、全双工传输层的协议~ 1.无连接 : 知道对端的端口号和IP可以直接传输,不需要建立连接 2..不可靠:没有确认机制,没有重传机制,不知道数据包能否能正确到达对端&#xff0…...

windows 下 oracle 数据库的备份与还原

1、备份 创建备份出来的文件存放的位置。 创建目录对象,在数据库中创建一个目录对象,该对象指向文件系统中用于存储导出文件的实际目录( sql 命令,可以在 plsql 中执行)。 -- 创建目录对象,\D:\Oracle19c\…...

LeetCode41☞缺失的第一个正数

关联LeetCode题号41 本题特点 数组,哈希表 本题思路 找缺失的最小正数,看举例说明缺失的正数,一种情况是连续的最小的正数,一种是缺失连续但不是最小的正数验证数组内数组是否连续,可以通过 nums[i]1 是否存nums组…...

毕业论文 | 基于STM32的自动烟雾报警系统设计

基于STM32的烟雾报警系统 一、系统设计原理1. **系统架构**2. **工作原理**二、核心公式与算法1. **MQ-2传感器浓度计算**2. **温度传感器数据处理**3. **校准与滤波**三、关键代码实现1. **ADC初始化与数据读取(以MQ-2为例)**2. **报警逻辑与阈值设置**3. **EEPROM存储阈值*…...

iOS 性能调优实战:三款工具横向对比实测(含 Instruments、KeyMob、Xlog)

iOS 性能调优实战:三款工具横向对比实测(含 Instruments、KeyMob、Xlog) 在日常 iOS 开发中,性能问题往往是最难排查、最影响体验的部分。无论是 CPU 峰值、内存飙升,还是偶发卡顿、异常崩溃,背后都隐藏着…...

flutter 专题 五十八 关于Flutter提示Your Xcode project requires migration的错误

最近,升级了Flutter后,运行之前的项目报了一个如下的错误: Your Xcode project requires migration. See https://flutter.dev/docs/development/ios-project-migration for details. Error launching application on iPhone 11 Pro.想到之前…...

【c++】【STL】list详解

目录 list的作用list的接口构造函数赋值运算符重载迭代器相关sizeemptyfrontbackassignpush_frontpop_frontpush_backpop_backinserteraseswapresizeclearspliceremoveremove_ifuniquemergesortreverse关系运算符重载(非成员函数) list的模拟实现结点类迭…...

redis 数据类型新手练习系列——List类型

redis 数据类型 Redis 主要支持以下几种数据类型: (1)string(字符串): 基本的数据存储单元,可以存储字符串、整数或者浮点数。 (2)hash(哈希):一个键值对集…...

文章记单词 | 第52篇(六级)

一,单词释义 grasp:英 [ɡrɑːsp] 美 [ɡrsp],v. 抓住;紧握;理解;领会;n. 紧握;控制;理解glue:英 [ɡluː] 美 [ɡluː],n. 胶水;胶…...

【今日三题】kotori和气球(排列) / 走迷宫(BFS最短路) / 主持人调度(二)(贪心+优先级队列)

⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 kotori和气球(排列)走迷宫(BFS最短路)主持人调度(二)(贪心优先级队列) kotori和气球(排列) kotori和…...

Mysql数据库高可用解决方案-Mysql Router

目录 一.MySQL Router介绍 1. 什么是 MySQL Router? 2. MySQL Router 的主要用途 3. MySQL Router 的工作原理 4. MySQL Router 的核心组件 5. MySQL Router 的部署和配置 6. MySQL Router 的优势 7. 注意事项 8. MySQL Router 与其他工具的对比 9. 总结 …...

windows系统 压力测试技术

一、CPU压测模拟 工具:CpuStres v2.0 官网:https://learn.microsoft.com/en-us/sysinternals/downloads/cpustres 功能:是一个工具类,用来模拟在一个进程中启动最多64个线程,且可以独立控制任何一个线程的启动/暂停、…...

汽车免拆诊断案例 | 2015款奔驰C200L车发动机起动延迟

故障现象  一辆2015款奔驰C200L车,搭载274发动机,累计行驶里程约为15.6万km。该车发动机起动延迟,且发动机故障灯异常点亮。 故障诊断  用故障检测仪检测,发动机控制单元中存储有故障代码“P001685 进气凸轮轴(气缸…...

Python AI图像艺术创作:核心技术与实践指南

Python与AI技术的结合为图像艺术创作开辟了全新维度,通过生成对抗网络(GANs)、扩散模型(如Stable Diffusion)和神经风格迁移等技术,创作者可以轻松生成具有高度创意和艺术性的图像作品。 这些技术不仅突破了传统艺术创作的局限性,还大幅降低了专业创作门槛,使艺术创作…...

比亚迪再获国际双奖 以“技术为王”书写中国汽车出海新篇章

近日,全球汽车行业权威奖项“2025世界汽车大奖”(World Car Awards)在纽约国际车展举行颁奖典礼,比亚迪海鸥(BYD SEAGULL/BYD DOLPHIN MINI)摘得“2025世界城市车(World Urban Car)”…...

虚幻商城 Quixel 免费资产自动化入库(2025年版)

文章目录 一、背景二、问题讲解1. Quixel 免费资产是否还能一键入库?2. 是不是使用了一键入库功能 Quixel 的所有资产就能入库了?3. 一键入库会入库哪些资产?三、实现效果展示四、实现自动化入库五、常见问题1. 出现401报错2. 出现429报错3. 入库过于缓慢4. 入库 0 个资产一…...

斯坦福RGA软件 老版本和兼容Windows 11版本可选

斯坦福RGA软件 老版本和兼容Windows 11版本可选...

RHCSA Linux 系统 文件系统权限

1. 文件的一般权限 (1)文件权限标识解读 drwxr - xr - x. 12 root root 144 Feb 17 16:51 usr ➤d:文件类型(d 表示目录) ➤rwx:文件所有者权限(读 r,写 w,执行 x&am…...