STM32 在PC端串口助手上打印中文字符

您所在的位置:网站首页 流程图可以直接打印吗 STM32 在PC端串口助手上打印中文字符

STM32 在PC端串口助手上打印中文字符

2024-07-12 15:08| 来源: 网络整理| 查看: 265

前言 本博文基于STM32F103ZET6和MDK5.2.6和库函数V3.5.0开发;本博文采用七星虫德飞莱开发板,USB-TTL电路,USART1和串口调试助手;如有不足,多指教;针对STM32CubeIDE环境的重定向请看https://blog.csdn.net/qq_45172156/article/details/108249811

串口通信作为拓展单片机功能的一个外设,其本身还有一个常用的功能就是用于调试使用,通过对一个值的输出从而观察所要的值是否正确,比较形象,但是自己在写串口的时候写出来的程序不能像当初VC++里的C语言一样利用printf()函数还输出汉字,而是一堆乱码的东西或者16进制数字,看着很难受,于是就决定把这个东西的原理给搞懂;串口的配置就不多说了,主要是针对STM32来说,printf()函数该怎么写;

printf()的重定向(三个步骤)

步骤一: 重定向: 简单来说就是用户写了一个跟C标准库一模一样的函数,在进行工程编译时,连接器检查到用户自己编写的有某个和C库函数同名的用户写的函数,就会优先采用用户编写的函数,这就叫重定向; 而且这里我们为了实现重定向printf()函数,我们重写了fputc(int ch,FILE *f)这个C标准库函数,因为printf()在C标准库函数中实质上是个宏定义,最终调用的是fputf(int ch,FILE *f)这个函数;

//重定向C库函数printf()到串口,重定向后可使用printf(); int fputc(int ch,FILE *f) { USART_SendData(USART1,(uint8_t)ch); while(!(USART_GetFlagStatus(USART1,USART_FLAG_TC))); return ch; }

printf()对应的底层函数接口在"stdio.h"中的第673行 在这里插入图片描述 注:

ch为要发送的8位数据;若使用C标准输出库函数,需要在main.c中把stdio.h头文件包含进来,还要在魔法棒中勾选一个“Use MicroLIB(使用微库)”,这个微库是MDK为嵌入式应用量身定做的C库,在编程时,要先有库,才能重定向;如下图配置; 步骤二 在这里插入图片描述 步骤三 在需要用到printf()函数的文件中加上头文件 stdio.h 文件;如下列工程; #include "stm32f10x.h" #include "usart.h" #include "stdio.h" //标准输入输出头文件; #include "systick.h" int main() { systick_Init(); USART1_Init(115200); while(1) { printf("无语尊wuyuzun\n"); delay_ms(100); } }

完成上面这两个操作后,就可以通过串口助手软件看输出了: 在这里插入图片描述

扩展

在对STM编程时,除了可以对printf进行重定向之外,还可以对scanf重定向; scanf()重定向函数如下:

int fgetc(FILE *stream) { while(!(USART1->SR & (1 DR; }

scanf()对应的底层函数接口在"stdio.h"中的第649行: 在这里插入图片描述

同理,还可以拓展C库中其他函数;

####### 也可以宏定义来实现(一下代码为HAL库方式)

#define printf(FORMAT,...) { \ sprintf(printf_buff,FORMAT,##__VA_ARGS__);\ HAL_UART_Transmit(&huart2,(uint8_t *)printf_buff,strlen(printf_buff),0xFFFF);\


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3