打印
[STM32F1]

重定向printf 到stm32串口

[复制链接]
605|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maqianqu|  楼主 | 2024-2-27 23:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、导入stdio.h库文件

/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include

/* USER CODE END Includes */



二、重写函数

/* USER CODE BEGIN 4 */



#ifdef __GNUC__



#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#define GETCHAR_PROTOTYPE int __io_getchar(FILE *f)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#define GETCHAR_PROTOTYPE int fgetc(FILE *f)

#endif /* __GNUC__ */



PUTCHAR_PROTOTYPE

{

    HAL_UART_Transmit(&huart4, (uint8_t *)&ch, 1, 0xFFFF);

    return ch;

}



GETCHAR_PROTOTYPE

{

  uint8_t ch = 0;

  HAL_UART_Receive(&huart4,(uint8_t *)&ch, 1, 0xFFFF);



  if (ch == 'r')

  {

      __io_putchar('r');

      ch = 'n';

  }

  return __io_putchar(ch);

}



/* USER CODE END 4 */



三、测试

然后就可以在程序中使用printf调试串口了。可以在main.c的主循环中加入下面一段代码验证printf是否已正确的重定向:

uint8_t rd[10];

scanf("%s",rd);

printf("hello %srn",rd);


使用特权

评论回复
沙发
xuanhuanzi| | 2024-2-29 22:42 | 只看该作者
重写调用的底层函数。

使用特权

评论回复
板凳
Charlene沙| | 2024-2-29 23:01 | 只看该作者
对,其实重定向就是再写这种函数,然后改成串口x就好了

使用特权

评论回复
地板
ulystronglll| | 2024-3-4 18:26 | 只看该作者
使用printf之前,需要对串口进行初始化。这包括设置波特率、数据位、停止位和校验位等参数。例如,你可以使用HAL库函数HAL_UART_Init()或LL库函数LL_USART_Init()来初始化串口。

使用特权

评论回复
5
modesty3jonah| | 2024-3-5 11:45 | 只看该作者
某些情况下,你可能希望串口发送是非阻塞的,即如果缓冲区满则不等待。这可以通过修改fputc函数来实现,使其在没有空间可用时立即返回。

使用特权

评论回复
6
mollylawrence| | 2024-3-5 15:08 | 只看该作者
在使用重定向函数时,要注意代码的兼容性问题。例如,使用__attribute__((weak))可以确保当其他文件提供了相同名称的强定义时,我们的重定向函数不会被优先使用。

使用特权

评论回复
7
kkzz| | 2024-3-5 17:31 | 只看该作者
根据你使用的库(标准库或HAL库),可能需要编写不同的fputc()函数。标准库通常需要你自己编写fputc()函数,而HAL库则提供了一个现成的USART_SendData()函数可以直接调用。

使用特权

评论回复
8
huquanz711| | 2024-3-5 19:41 | 只看该作者
也可以不用重定向,直接用格式化字符串函数处理就是了。

使用特权

评论回复
9
uiint| | 2024-3-7 11:30 | 只看该作者
由于printf输出可能包含复杂的字符串操作,你可能需要实现同步机制来确保所有数据都被正确发送。此外,你可能需要一个缓冲区来存储要发送的数据。

使用特权

评论回复
10
earlmax| | 2024-3-7 22:47 | 只看该作者
重定向是指将标准输出函数(如fputc)的输出指向目标设备,即串口。这是因为printf函数内部调用了fputc,而fputc的输出默认是指向标准输出设备的,不同库中的fputc输出指向可能不同,因此在STM32上需要将其重定向到USART(串口)。

使用特权

评论回复
11
sdlls| | 2024-3-9 16:56 | 只看该作者
为了在STM32上使用printf,你可能需要包含stdio.h并定义__STM32__或__STM32F1__等宏。这取决于你的STM32型号和编译器。

使用特权

评论回复
12
wwppd| | 2024-3-9 21:54 | 只看该作者
默认情况下,printf函数是针对标准输出设备(如PC的显示器)设计的,不直接支持STM32的串口输出。

使用特权

评论回复
13
geraldbetty| | 2024-3-11 16:15 | 只看该作者
考虑添加错误处理逻辑,以处理可能出现的串口通信错误,如帧错误、噪声或溢出。

使用特权

评论回复
14
uytyu| | 2024-3-11 18:35 | 只看该作者
由于printf可能产生大量输出,需要考虑串口缓冲区的大小以及发送效率。可能需要实现一个环形缓冲区或者通过DMA来加速数据传输,避免在发送大量数据时堵塞。

使用特权

评论回复
15
ulystronglll| | 2024-3-12 12:40 | 只看该作者
必须重写putc函数,它是printf在输出字符时调用的基本函数。重写后的putc函数应将字符通过串口发送出去。

使用特权

评论回复
16
juliestephen| | 2024-3-12 17:35 | 只看该作者
如果程序中使用了多线程,需要确保在多个线程中访问串口时互斥,以避免数据错乱和异常。

使用特权

评论回复
17
uytyu| | 2024-3-14 12:06 | 只看该作者
在重定向printf之前,确保已经正确初始化了目标串口,包括波特率、数据位、停止位和奇偶校验位的配置。

使用特权

评论回复
18
qiufengsd| | 2024-3-14 22:39 | 只看该作者
在程序中,需要初始化相应的串口,并将其与printf函数重定向功能关联起来。可以使用HAL库中的HAL_UART_Init()函数进行初始化。

使用特权

评论回复
19
jonas222| | 2024-3-15 14:49 | 只看该作者
printf函数依赖于putchar函数来输出单个字符。你需要实现一个自定义的putchar函数,该函数将字符发送到串口。

使用特权

评论回复
20
sanfuzi| | 2024-3-15 21:09 | 只看该作者
printf函数相对于其他串口发送函数来说,性能较低。在对性能有较高要求的场合,可以考虑使用其他串口发送函数,如HAL_UART_Transmit()。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

2255

帖子

2

粉丝