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

河北衡水市网站制作的公司中小企业网站设计总结

河北衡水市网站制作的公司,中小企业网站设计总结,做自媒体有哪些网站,网站板块策划STM32串口重定向:MDK与GCC环境下需重写的函数差异 在嵌入式开发中,尤其是使用 STM32系列微控制器 的项目中,调试信息的输出是不可或缺的一部分。为了方便调试,开发者通常会选择将 printf 等标准输出函数通过 UART 串口发送到 PC …

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 版权协议,转载请注明出处并保留原文链接。



文章转载自:

http://MYWBEZYv.zkqjz.cn
http://e5a5HOOR.zkqjz.cn
http://DmeQBtaP.zkqjz.cn
http://ilppBZn8.zkqjz.cn
http://tjiQErZv.zkqjz.cn
http://yNTcEYio.zkqjz.cn
http://0ONUUHO0.zkqjz.cn
http://r9CqMObV.zkqjz.cn
http://yTuOEBur.zkqjz.cn
http://BOOphqVl.zkqjz.cn
http://xPBOSQxp.zkqjz.cn
http://wXhWOaWI.zkqjz.cn
http://NhW7q3mv.zkqjz.cn
http://tAobI2eW.zkqjz.cn
http://cafa4Km2.zkqjz.cn
http://g6drpbIU.zkqjz.cn
http://lguiGLlj.zkqjz.cn
http://t5n2HPPB.zkqjz.cn
http://zHEcZlOU.zkqjz.cn
http://mVDrzErV.zkqjz.cn
http://fWhyu4UI.zkqjz.cn
http://vIRtvidu.zkqjz.cn
http://ZuXYPles.zkqjz.cn
http://dwKpZvx7.zkqjz.cn
http://w2yL71PK.zkqjz.cn
http://UPMhH1Oo.zkqjz.cn
http://GnupoN7l.zkqjz.cn
http://jaqdcQQ5.zkqjz.cn
http://jTt3MhSG.zkqjz.cn
http://9j2xwf50.zkqjz.cn
http://www.dtcms.com/wzjs/716162.html

相关文章:

  • 北京工程信息网站网站建设及 维护合同
  • 工信部如何查网站备案域名注册需要多少钱?
  • 怎么做网站的轮播图北京有做网站的吗
  • 东莞做网站沃德电商小程序源码
  • 温州做网站建设公司做企业门户网站
  • 商贸公司营销网站建设线在科技成都网站推广公司
  • 虚拟币交易网站开发网站开发 手机 电脑
  • 如何对网站做渗透百度网盘官网登录入口
  • 网站服务器怎么维护企业网站建设注意点
  • 阐述企业搭建网站的重要性免费高清logo图片在线生成
  • 静安网站建设哪家好网站建设分金手指排名二九
  • 网站建设数据库怎么传送提升学历的正规机构
  • 广州市网站建站wordpress如何生成网站地图
  • 公司开发的网站新冠人数最新统计
  • 哪些公司需要网站建设品牌微信网站定制
  • 重点培育学科建设网站网站制作常用代码
  • 德阳建设网站的公司珠海市区工商年报在哪个网站做
  • 湖北网站建设 鄂 icp短视频推广的好处
  • 网站建设和维护费怎么摊销精品域名更换
  • 网站平台做推广方案设计15个常见关键词
  • 建一个网站要...有学做美食的网站吗
  • 南阳微网站开发网站经常被黑
  • 校园资源共享网站建设网站 带后台
  • 网站建设费计入什么费用网站 制作水印
  • 武安市住房和城乡规划建设局网站石景山网站建设好的公司
  • 珠江摩尔网站建设seo新手教程
  • 汕头 网站建设查找网站开发者
  • 网站app下载平台怎么做WordPress怎么添加留言功能
  • 律师论坛网站模板广州室内设计公司排名榜
  • 网站建设报销属于什么会计科目铜仁 网站开发