前言
本文主要讲述在使用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中添加图中标蓝部分,添加后点击应用并关闭。
效果
注意:使用前要调试好串口助手的波特率等数据(根据自己配置的数据来调)
四、总结
以上是本人在串口学习中遇到的一些问题和注意点,如有瑕疵,还望包涵,欢迎大家在评论区提出自己的看法。
版权归原作者 Rabbit—Smash 所有, 如有侵权,请联系我们删除。