stm32---在keil 5中使用printf函数输出到串口USART(printf函数的移植方法)以及补充窗口printf函数输出汉字

这篇具有很好参考价值的文章主要介绍了stm32---在keil 5中使用printf函数输出到串口USART(printf函数的移植方法)以及补充窗口printf函数输出汉字。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Keil5 设置

1.打开工程选项

keil printf,stm32,嵌入式硬件,单片机

2.勾选上Use MicroLIB(MicroLIB时Keil为嵌入式平台优化的一个精简库)

keil printf,stm32,嵌入式硬件,单片机

1.方法一(printf针对指定的串口,如USART1):

主要代码展示:

#include "stm32f10x.h"                  // Device header
#include <stdio.h>

/*对应的引脚号*/
#define USART1_TX GPIO_Pin_9 


/*模块需要使用到的端口:GPIOA或GPIOB*/
#define BUS GPIOA         

/**
  * @brief  Serial_Init---对串口通信的初始化配置(针对发送数据即USART1外设的TX引脚)
  * @param  无
  * @retval 无
  */
void Serial_Init(void)
{
	//1.开启APB2外设的时钟---USART1是APB2的外设
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//2.初始化GPIO的引脚配置(即USART1外设的TX引脚)
	GPIO_InitTypeDef GPIO_InitStructure;
	/* TX引脚是USART1外设控制的输出脚,需要选复用推挽输出模式 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
	GPIO_InitStructure.GPIO_Pin = USART1_TX;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(BUS, &GPIO_InitStructure);
	
	//3.初始化USART的各项配置
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600; //波特率---9600
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件数据流控选择---不需要流控
	USART_InitStructure.USART_Mode = USART_Mode_Tx;//串口模式---发送模式
	USART_InitStructure.USART_Parity = USART_Parity_No;//数据帧的校验位---不需要校验
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//数据帧的停止位---选择1位的停止位
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据帧字长---选择8位
	USART_Init(USART1, &USART_InitStructure);
	
	//4.开启USART
	USART_Cmd(USART1, ENABLE);
}	

/**
  * @brief  Serial_SendByte---发送1位字节数据
  * @param  Byte---发送的字节数据
  * @retval 无
  */
void Serial_SendByte(uint8_t Byte)
{
	//1.发送数据
	USART_SendData(USART1, Byte);
	//2.判断发送数据寄存器为空的标志位(标志位为1则表示数据转移到移位寄存器,为0则还没有转移到移位寄存器)
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}


/**
  * @brief  Serial_SendArray---发送数组元素是字节数据的数组
  * @param  *Array---发送的数组的首地址指针
  * @param  Length---发送的数组的长度
  * @retval 无
  */
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for(i = 0; i < Length; i++)
	{
		Serial_SendByte(Array[i]);
	}
}

/**
  * @brief  Serial_SendString---发送一串字符串
  * @param  *String---发送的字符串的地址指针
  * @retval 无
  */
void Serial_SendString(char *String)
{
	uint8_t i;
	for(i = 0; String[i] != '\0'; i++)
	{
		Serial_SendByte(String[i]);
	}
}

/**
  * @brief  Serial_Pow---计算X的Y次方值
  * @param  X---底数
  * @param  Y---指数
  * @retval Result---计算的结果值
  */
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while(Y--)
	{
		Result *= X;
	}
	return Result;
}

/**
  * @brief  Serial_SendNumber---发送无符号整型数据(即数字)
  * @param  Number---要发送的数字数据
  * @param  Length---数字数据的长度
  * @retval 无
  */
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for(i = Length; i > 0; i--)
	{
		Serial_SendByte((Number / Serial_Pow(10, i-1)) % 10 + '0');
	}
	
}

/**
  * @brief  fputc---printf的底层函数(移植printf函数,使printf输出到串口)
  * @param  ch---需要输出的字符
  * @param  *f---指定的某个指针地址
  * @retval ch---输出的字符
  */
int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}

对printf函数进行重定向,目的是将printf函数打印的东西输出到串口(printf默认打印输出到屏幕,但单片机没有屏幕,所以需要重定向)

  • 在串口函数初始化的c文件中加上#include <stdio.h>
#include <stdio.h>
  • 重写fputc函数 (fputc是printf函数的底层,printf就是不断调用fputc函数一个个打印,把fputc函数重定向到串口,这样子printf自然就输出到串口)
int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}

 2. 方法二(sprintf和Serial_SendString针对所有串口可行):

在主函数main.c编写如下代码后直接运行.

	char String[100];
	sprintf(String, "Num = %d\r\n", 99);
	Serial_SendString(String);

3. 方法三(对sprintf进行可变参数的函数封装,方便使用):

  • 引入#include <stdarg.h>
#include <stdarg.h>
  •  对sprintf进行可变参数的函数封装

/**
  * @brief  Serial_Printf---对sprintf进行封装,便于数据输出到串口
  * @param  *format---接收的格式化字符串
  * @param  ...---接收可变参数列表
  * @retval 无
  */
void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;//va_list---列表名
	va_start(arg, format);//从format位置后开始接收参数表,放在arg
	vsprintf(String, format, arg);/* vsprintf---使用参数列表发送格式化输出到字符串。 */
	va_end(arg);//释放参数表
	Serial_SendString(String);//串口发送字符串
}
  • 在主函数main.c调用
	Serial_Printf("Num = %d\r\n", 77);

补充---串口printf输出汉字

1.打开工程选项

keil printf,stm32,嵌入式硬件,单片机

2.在C/C++选项下的Misc Controls输入--no-multibyte-chars这串参数,然后点击OK

keil printf,stm32,嵌入式硬件,单片机

3.在主函数main.c使用函数输出中文

Serial_Printf("你好,世界!");

4. 在串口助手就能看见输出的中文

keil printf,stm32,嵌入式硬件,单片机 

!!!!!注意:出现乱码的话需要查看keil5的编码格式跟串口助手接收的格式是否一致,如:

点击设置选项

keil printf,stm32,嵌入式硬件,单片机

现在是GBK编码格式

 keil printf,stm32,嵌入式硬件,单片机

串口助手也选择GBK格式

keil printf,stm32,嵌入式硬件,单片机

如果keil5选择的时utf-8格式,那串口助手也要设置成utf-8格式

keil printf,stm32,嵌入式硬件,单片机keil printf,stm32,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-753897.html

到了这里,关于stm32---在keil 5中使用printf函数输出到串口USART(printf函数的移植方法)以及补充窗口printf函数输出汉字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32(HAL库)使用printf函数打印到串口

    目录 1、简介 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 串口外设配置  2.3 项目生成  3、KEIL端程序整合   4、效果测试 在HAL库中,常用的printf函数是无法使用的。本文通过重映射实现在HAL库中进行printf函数。 2.1.1 SYS配置  2.1.2 RCC配置 在usart.c函数最下方复制如下代码 接着在

    2024年02月14日
    浏览(44)
  • STM32串口printf调试输出(SSCOM V5.13.1)

    PC与CPU相互通信就是通过USB Type_C接口和USB电平转换实现的。 我们可以看到,CPU通过管脚USART1连接CH340C芯片将USB转串口,实现PC与CPU之间的通信。 当然,这里用的是CH340的芯片,我们就需要安装ch340串口。 按住Ctrl+s生成代码。 在usart.h中添加头文件stdio.h 标准库的 printf函数 能方

    2024年02月12日
    浏览(49)
  • STM32CubeMx+MATLAB Simulink串口输出实验,UART/USART串口测试实验

    STM32CubeMx+MATLAB Simulink串口输出实验

    2024年02月21日
    浏览(44)
  • 普中STM32-PZ6806L开发板(HAL库函数实现-USART1 printf+scanf/gets)

    实现printf+scanf/gets通过USART1 的发送接收。 主芯片串口引脚图 我的板子板子自带串口坏掉了, 所以使用USB转TTL线, 连接如下 电路原理图 实物图 scanf是以空白符(空格、制表符、换行等等)为结束标志的,当遇到空白符是就会结束一次输入,如果你需要读取空格的话可以使用gets或者

    2024年02月04日
    浏览(51)
  • STM32串口通信中的USART_RecieveData函数分析

    拿这个中断函数为例         很多人可能注意到了接收数据函数的返回类型为无符号短整型,疑惑这里为什么用了一个无符号字符类型变量rec接收。 先看看这个函数的定义         其实,是因为串口设置的字长为8,所以数据寄存器中第八位为0,第0~7位为数据有效位,

    2024年02月11日
    浏览(38)
  • 【正点原子STM32】SYSTEM文件夹介绍(sys文件夹、deley文件夹、USART 文件夹、SysTick、printf函数、fputc函数、半主机模式)

    一、sys文件夹介绍 二、deley文件夹介绍 2.1、deley文件夹函数简介 2.2、SysTick工作原理 2.3、SysTick寄存器介绍 2.4、delay_init()函数 2.5、delay_us()函数 2.6、delay_ms()函数 三、USART 文件夹介绍 3.1、printf函数输出流程 3.2、printf的使用 3.3、printf函数支持 半主机模式简介 方法一:微库法

    2024年03月11日
    浏览(93)
  • STM32 F103C8T6学习笔记3:串口配置—串口收发—自定义Printf函数

    今日学习使用STM32 C8T6的串口,我们在经过学习笔记2的总结归纳可知,STM32 C8T6最小系统板上有三路串口,如下图:  今日我们就着手学习如何配置开通这些串口进行收发,这里不讲串口通信概念与基础,可以自行网上查找,本文直接开始介绍库函数与编程实现:          

    2024年02月10日
    浏览(38)
  • STM32使用串口printf乱码问题解决方法

    使用stm32系列单片机串口打印问题,在使用HAL库重新定义printf为串口输出后,输出的内容全都是乱码,试了网上的方法后还是乱码。  像这样的    最后发现是串口调试助手和keil的文字编码方式不同, keil中是GB 2312,串口调试助手是UFT_8,所以打印出来才会乱码  将串口调试助

    2024年02月11日
    浏览(37)
  • STM32F4X USART串口使用

    串口是MCU与外部通信的重要通信接口,也是MCU在开发过程中的调试利器。串口通信有几个重要的参数,分别是波特率、起始位、数据位、校验位。双方在进行串口通信前必须要约定好通信的参数,否则会导致通信失败。 起始位是自动产生,无需配置,通常是产生一个低电平为

    2024年02月11日
    浏览(60)
  • STM32开发中printf利用重定向方法输出到串口(CubeMX 基于HAL库方法,带实际项目应用技巧 巧用goto语句)

    在stdio.h中的printf 原本输出到控制台, 在单片机应用中一般将其改到串口, 并利用串口输出信息来调试程序,非常方便。(本文以USART1为例) 此外CubeMX及CubeIDE 由于自动生成基础代码,因此每当更改硬件配置的时候, 都会被重置生成的基础代码。 这里使用goto语句来避免部分

    2024年02月04日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包