c - 将 printf 重定向到串行端口

标签 c embedded printf stdout stm32

我想使用函数printf来打印串口上的字符。我读过这两篇文章12 ,但我不确定是否理解manip:

1st link据说:

要启用 printf 功能,首先需要创建一个新的 __FILE 结构。然后使用 FILE 结构调用该结构。

为什么我必须创建__FILE结构我并没有真正理解这句话。

2nd link据说

为了完成与标准 I/O 库的分离,我们还必须重新定义 __stdout__stdin。这些可以在 __FILE 结构声明下方的 retarget.c 文件中找到。

如果我重新定义这两个变量,那不是编译错误,我的意思是重新定义。

最佳答案

这可能是 How to make printf work on STM32F103? 的重复

无论如何,我也将在上面的帖子中发布的答案放在这里。

编写自己的 printf 实现是一种选择,而且对我来说可能是最推荐的选择。从标准库实现中获取一些灵感并编写您自己的版本,以满足您的要求。一般来说,您需要做的是,首先重新定位 putc 函数以通过串行接口(interface)发送 char 。然后使用 putc 自定义实现重写 printf 方法。也许,一种非常简单的方法是通过递归调用 putc 函数按字符发送字符串。

最后但并非最不重要的一点是,您可以找到一些轻量级 printf 实现。这些轻量级实现提供的代码大小和功能集介于自定义编写的 printf 函数和标准的 prinf 函数(又名“野兽”)之间。我最近尝试过这一点,并对它在 ARM 内核上的内存占用和所需执行周期数方面的性能感到非常满意。 http://www.sparetimelabs.com/tinyprintf/tinyprintf.php

-PS

从我自己的著作中复制 - http://mycola.info/2015/02/09/lightweight-printfscanf-for-embedded-applications/

关于c - 将 printf 重定向到串行端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39811637/

相关文章:

c - 具有返回值的 OS X asm C 调用

c - 在mex文件matlab中使用magma_dysevd

android - 如何调试 YAFFS?

assembly - 当我切换到用户模式时,为什么我的 CPSR 中会出现垃圾?

php - 通过 Web 应用程序使 LED 闪烁

Java printf(字符串、Val、字符串)

c - ioremap 在物理地址上失败

c - 函数练习 - 三角数函数在 C 中不起作用

c - 将字符串添加到 sprintf 中

c - 解释一下程序中fprintf()的奇怪行为,在文件中打印一些不寻常的字符