stm32cubemx中生成工程的usart1使用printf的兩種方法
最近在從標準庫轉型爲stm32cubemx開發記錄一下遇到的小問題
網上已經有很多相同的printf解決方法了,這裏整理兩種簡單的方法
方法一
1、在生成的usart.c中的/* Includes ------------------------------------------------------------------*/下添加
#include "stdio.h"
不添加會報FILE錯誤
修正內容:測試以後MX重新生成代碼在usart.c的Inlcudes的#include "stdio.h"會被刪除,還是把#include "stdio.h"放在下面/* USER CODE BEGIN 0 */的代碼保護區吧
然後在代碼保護區/* USER CODE BEGIN 0 */添加,不在保護區添加MX生成代碼時會被刪除,也不能自己手動添加保護區
/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
/* With GCC, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART2 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
2、然後在main.c中的
/* USER CODE BEGIN Includes /
/ USER CODE END Includes */
保護區中添加
#include "stdio.h"
不能添加在/* Includes ------------------------------------------------------------------*/中,重新生成時會被刪除
如果不在main.c下添加的話會報printf錯誤
3、在主函數中循環寫段代碼測試一下
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
printf("123!\r\n");
}
/* USER CODE END 3 */
這裏就不截圖了,實際已經在串口助手成功打印了
還有第二種printf的方法比較方便簡單
方法二
這裏提供了一種和網上不一樣的printf使用方法,咱也是學習來的這裏記錄一下
生成工程以後不用處理usart.c,直接在main.c中的保護區添加代碼
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* USER CODE BEGIN PD */
#define printf1(...) HAL_UART_Transmit(&huart1,\
(uint8_t *)u_buf,\
sprintf((char*)u_buf,__VA_ARGS__),\
0xffff)
/* USER CODE END PD */
然後還是在main.c的保護區要定義一下u_buf的數組
/* USER CODE BEGIN PV */
uint8_t u_buf[256];
/* USER CODE END PV */
之後我們就可以在主函數中使用了,來測試一下
這裏主要調用的時候用的是printf1,而不是printf
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(2000);
printf1("123456789");
}
/* USER CODE END 3 */
結果串口助手成功打印,完結。