[STM32F1] 重定向printf 到stm32串口

[复制链接]
2723|37
 楼主| maqianqu 发表于 2024-2-27 23:48 | 显示全部楼层 |阅读模式
  1. 一、导入stdio.h库文件

  2. /* Private includes ----------------------------------------------------------*/

  3. /* USER CODE BEGIN Includes */

  4. #include

  5. /* USER CODE END Includes */



  6. 二、重写函数

  7. /* USER CODE BEGIN 4 */



  8. #ifdef __GNUC__



  9. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

  10. #define GETCHAR_PROTOTYPE int __io_getchar(FILE *f)

  11. #else

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

  13. #define GETCHAR_PROTOTYPE int fgetc(FILE *f)

  14. #endif /* __GNUC__ */



  15. PUTCHAR_PROTOTYPE

  16. {

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

  18.     return ch;

  19. }



  20. GETCHAR_PROTOTYPE

  21. {

  22.   uint8_t ch = 0;

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



  24.   if (ch == 'r')

  25.   {

  26.       __io_putchar('r');

  27.       ch = 'n';

  28.   }

  29.   return __io_putchar(ch);

  30. }



  31. /* USER CODE END 4 */



  32. 三、测试

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

  34. uint8_t rd[10];

  35. scanf("%s",rd);

  36. 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()来初始化串口。
modesty3jonah 发表于 2024-3-5 11:45 | 显示全部楼层
某些情况下,你可能希望串口发送是非阻塞的,即如果缓冲区满则不等待。这可以通过修改fputc函数来实现,使其在没有空间可用时立即返回。
mollylawrence 发表于 2024-3-5 15:08 | 显示全部楼层
在使用重定向函数时,要注意代码的兼容性问题。例如,使用__attribute__((weak))可以确保当其他文件提供了相同名称的强定义时,我们的重定向函数不会被优先使用。
kkzz 发表于 2024-3-5 17:31 | 显示全部楼层
根据你使用的库(标准库或HAL库),可能需要编写不同的fputc()函数。标准库通常需要你自己编写fputc()函数,而HAL库则提供了一个现成的USART_SendData()函数可以直接调用。
huquanz711 发表于 2024-3-5 19:41 来自手机 | 显示全部楼层
也可以不用重定向,直接用格式化字符串函数处理就是了。
uiint 发表于 2024-3-7 11:30 | 显示全部楼层
由于printf输出可能包含复杂的字符串操作,你可能需要实现同步机制来确保所有数据都被正确发送。此外,你可能需要一个缓冲区来存储要发送的数据。
earlmax 发表于 2024-3-7 22:47 | 显示全部楼层
重定向是指将标准输出函数(如fputc)的输出指向目标设备,即串口。这是因为printf函数内部调用了fputc,而fputc的输出默认是指向标准输出设备的,不同库中的fputc输出指向可能不同,因此在STM32上需要将其重定向到USART(串口)。
sdlls 发表于 2024-3-9 16:56 | 显示全部楼层
为了在STM32上使用printf,你可能需要包含stdio.h并定义__STM32__或__STM32F1__等宏。这取决于你的STM32型号和编译器。
wwppd 发表于 2024-3-9 21:54 | 显示全部楼层
默认情况下,printf函数是针对标准输出设备(如PC的显示器)设计的,不直接支持STM32的串口输出。
geraldbetty 发表于 2024-3-11 16:15 | 显示全部楼层
考虑添加错误处理逻辑,以处理可能出现的串口通信错误,如帧错误、噪声或溢出。
uytyu 发表于 2024-3-11 18:35 | 显示全部楼层
由于printf可能产生大量输出,需要考虑串口缓冲区的大小以及发送效率。可能需要实现一个环形缓冲区或者通过DMA来加速数据传输,避免在发送大量数据时堵塞。
ulystronglll 发表于 2024-3-12 12:40 | 显示全部楼层
必须重写putc函数,它是printf在输出字符时调用的基本函数。重写后的putc函数应将字符通过串口发送出去。
juliestephen 发表于 2024-3-12 17:35 | 显示全部楼层
如果程序中使用了多线程,需要确保在多个线程中访问串口时互斥,以避免数据错乱和异常。
uytyu 发表于 2024-3-14 12:06 | 显示全部楼层
在重定向printf之前,确保已经正确初始化了目标串口,包括波特率、数据位、停止位和奇偶校验位的配置。
qiufengsd 发表于 2024-3-14 22:39 | 显示全部楼层
在程序中,需要初始化相应的串口,并将其与printf函数重定向功能关联起来。可以使用HAL库中的HAL_UART_Init()函数进行初始化。
jonas222 发表于 2024-3-15 14:49 | 显示全部楼层
printf函数依赖于putchar函数来输出单个字符。你需要实现一个自定义的putchar函数,该函数将字符发送到串口。
sanfuzi 发表于 2024-3-15 21:09 | 显示全部楼层
printf函数相对于其他串口发送函数来说,性能较低。在对性能有较高要求的场合,可以考虑使用其他串口发送函数,如HAL_UART_Transmit()。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

2773

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部