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

在STM32上实现printf函数的串口重定向

无论是在MDK(Keil)还是GCC编译器环境中,通过重写底层字符输出函数,使得标准库中的printf系列函数可以通过UART串口发送数据到PC端进行查看和分析。

核心思想
  • 重写或实现底层字符输出函数,使printf函数能够通过UART发送数据。
  • 针对不同的编译器环境,采取不同的实现方式。
MDK(Keil)环境下
  • 实现fputc()__io_putchar()函数:
    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()
GCC环境下
  • 实现_write()函数来捕捉write()调用:
    int _write(int fd, char *ptr, int len) {
        HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);
        return len;
    }
    
兼容性处理

为提高代码复用性和可维护性,可以使用预处理器宏定义来统一代码风格,避免重复编写两个版本的重定向函数:

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE {
    HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
    return ch;
}

#ifdef __GNUC__
int _write(int fd, char *ptr, int len) {
    HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);
    return len;
}
#endif

切换编译器即可自动适配对应函数。

支持浮点数打印

  • 如果需要支持浮点数格式化:你需要在Makefile中添加特定的链接选项来确保浮点数的支持。这是因为默认情况下,为了节省空间,某些嵌入式C库可能会禁用浮点数支持。要启用它,你需要在Makefile中添加以下内容:
    LDFLAGS += -lc -lrdimon -u _printf_float
    
    这些选项的作用是:
    • -lc:链接标准C库。
    • -lrdimon:链接一个提供I/O支持的库,这对于一些运行时环境是必要的。
    • -u _printf_float:强制链接器包含浮点数处理相关的符号,使得printf能够处理浮点数格式化字符串。
printf重定向是指将printf函数的输出从默认的显示器改为其他设备或文件。在C语言中,可以通过重定义fputc函数来实现printf重定向。具体来说,可以通过重定义fputc函数将printf的输出重定向串口、文件或其他设备上。 示例代码中使用了freopen函数来实现printf重定向。首先,通过调用freopen函数将标准输出(stdout)重定向到指定的文件或设备。例如,可以将printf的输出重定向到USART1串口,这样就可以将单片机的数据打印到PC上的超级终端或串口调试助手。然后,通过再次调用freopen函数将标准输出恢复为默认的显示器。 需要注意的是,重定义fputc函数是实现printf重定向的关键。在重定义的fputc函数中,可以将printf的输出数据重定向到指定的设备或文件,例如将数据重定向到ITM端口。 总结起来,printf重定向是通过重定义fputc函数来实现的,可以将printf的输出从默认的显示器改为其他设备或文件。 #### 引用[.reference_title] - *1* [printf函数的重定向](https://blog.youkuaiyun.com/weixin_51121577/article/details/127337297)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [printf重定向的相关总结](https://blog.youkuaiyun.com/gogo0707/article/details/124652111)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值