STM32CubeIDE重定向printf函数

本文介绍如何在STM32CubeIDE中重定向printf函数至特定串口,并演示如何输出浮点数。涉及步骤包括头文件导入、串口输出函数实现及常见问题解决。

1. 重定向printf函数

1.1 调用头文件

#include "stdio.h"

1.2 重定向输出

// huartx为你定义的需要重定向的串口名
int __io_putchar(int ch)
{
	HAL_UART_Transmit(&huartx, (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}

2. 输出浮点数

  1. Project Explorer 中右键选择需要设置的项目名;
  2. 选择最后一项 Properties
  3. 选择 C/C++ Build
  4. 选择 Settings
  5. 选择 MCU Settings
  6. 勾选Use float with printf from newlib-nano

在这里插入图片描述

3. 常见问题

  1. 使用 printf 时末尾要带换行符 \n ,否则可能不能正常输出
STM32CubeIDE重定向printf输出有多种方法,以下为几种常见方式: ### 方法一:自定义函数实现重定向 需自定义函数实现printf输出重定向,核心代码如下: ```c #include <stdio.h> //包含对fputc中FILE类型的定义 #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; } ``` 此代码通过定义`PUTCHAR_PROTOTYPE`,根据不同编译器情况选择合适函数名,在函数中利用`HAL_UART_Transmit`函数将字符通过串口发送出去 [^2]。 ### 方法二:重定向`__io_putchar`函数 步骤如下: 1. 调用头文件: ```c #include "stdio.h" ``` 2. 重定向输出: ```c // huartx为你定义的需要重定向的串口名 int __io_putchar(int ch) { HAL_UART_Transmit(&huartx, (uint8_t *)&ch, 1, 0xFFFF); return ch; } ``` 若要输出浮点数,在`Project Explorer`中右键选择需要设置的项目名;选择最后一项`Properties`;选择`C/C++ Build`;选择`Settings`;选择`MCU Settings`;勾选`Use float with printf from newlib-nano` [^3]。 ### 方法三:重定义`_write`函数 代码如下: ```c /* USER CODE BEGIN 0 */ #include "stdio.h" // 重定向printf start //_write函數在syscalls.c中, 使用__weak定義, 所以可以直接在其他文件中定義_write函數 __attribute__((weak)) int _write(int file, char *ptr, int len) { if(HAL_UART_Transmit(&huart1, ptr, len, 0xffff) != HAL_OK) { Error_Handler(); } } // 重定向printf end ``` 该方法利用`__attribute__((weak))`特性,在其他文件中重新定义`_write`函数,通过`HAL_UART_Transmit`函数实现数据发送 [^4]。 ### 方法四:结合`__io_putchar`和`_write`函数 代码如下: ```c // 重定向print start int __io_putchar(int ch) { //具体哪个串口可以更改USART1为其它串口 while ((USART3->ISR & 0X40) == 0); //循环发送,直到发送完毕 USART3->TDR = (uint8_t) ch; return ch; } //_write函數在syscalls.c中, 使用__weak定義, 所以可以直接在其他文件中定義_write函數 __attribute__((weak)) int _write(int file, char *ptr, int len) { int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++) { __io_putchar(*ptr++); } return len; } // 重定向print end ``` 此方法先定义`__io_putchar`函数实现单个字符发送,再在`_write`函数中循环调用`__io_putchar`函数实现字符串发送 [^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值