STM32CubeIDE串口printf函数输出中文乱码(配置教程+解决方法)

目录

前言

平台环境

软件:STM32CubeIDE

硬件:STM32H7A3ZIT6Q

一、串口配置

二、printf重定向

三、中文乱码解决方案

步骤

效果

四、总结


前言

本文主要讲述在使用CubeIDE配置串口通信的过程中,如何重定向printf()函数,以及如何解决在串口打印中文时输出乱码的情况。

平台环境

软件:STM32CubeIDE

           串口调试助手

硬件:STM32H7A3ZIT6Q


一、串口配置

主要配置的内容为NVIC;RCC;SYS;USB_OTG_HS;USART3(作者使用串口3,可根据自身情况修改)

(1)RCC:

PS:注意在时钟树配置界面将其配置成8MHz(推荐),时钟配错会导致输出乱码。

(2)NVIC:打开中断

 (3)SYS:

 (4)USART3:

 (5)USB_OTG_HS:

 

 串口配置完成,但这时候还不能使用printf函数来打印数据,需要我们重写函数。


二、printf重定向

首先需要我们引用头文件,注意要放在private includes下面,如图所示:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdio.h>

/* USER CODE END Includes */

接着我们要在USER CORE BEGIN4/USER END BEGIN4之间插入以下代码:

/* 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(&huart3, (uint8_t *)&ch, 1, 0xFFFF);

	return ch;
}

GETCHAR_PROTOTYPE
{
	uint8_t ch = 0;
	HAL_UART_Receive(&huart3,(uint8_t *)&ch, 1, 0xFFFF);

	if (ch == '\r')
	{
		__io_putchar('\r');
		ch = '\n';
	}

	return __io_putchar(ch);
}

/* USER CODE END 4 */

另外,补充一点,如果想要发送浮点数据,还需进行以下操作

首先找到任务栏中的project ,左击最底下找到properties。

之后找到c/c++ Build栏中的settings

到这里就完成了printf的重定向,可以引用printf函数了

但是!

这时候会出现输出乱码的情况,,如图:

 所以需要进行以下设置


三、中文乱码解决方案

步骤

首先找到任务栏中的project ,左击最底下找到properties

 点击properties后的界面,注意若只是下面界面中other栏中改成GBK是无效的,其实这个地方选GBK或者UTF-8没有什么影响,只是选择UTF-8时,串口打印中文会偶尔出现乱码,GBK则会好一点

 界面左侧找到c/c++ Build栏中的settings

 在左侧other flags中添加图中标蓝部分,添加后点击应用并关闭。

效果

 注意:使用前要调试好串口助手的波特率等数据(根据自己配置的数据来调)

四、总结

以上是本人在串口学习中遇到的一些问题和注意点,如有瑕疵,还望包涵,欢迎大家在评论区提出自己的看法。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32CubeIDE串口printf函数输出中文乱码(配置教程+解决方法)

发表评论