对于stm32中printf函数的移植方法

一、准备工作

使用printf之前需要先打开工程选项,把use microLIB选项打开。microlib是keil为嵌入式平台优化的一个精简库,本文使用到的printf将会用到这个microlib。

二、对printf进行重定向

将printf打印的东西输出到串口,由于printf默认输出到屏幕,但是单片机没有屏幕,所以要进行重定向。

1.在串口的c文件里加上#include<stdio.h>

2.在后面重写fputc函数

cpp 复制代码
int fputc(int ch, FILE *f)	//参数按此配置即可,
{	
	//将fputc重定向到串口
	Serial_sendByte(ch);	
	return ch;	
}

3.fputc和printf之间的联系

fputc是printf的底层,printf函数在打印的时候,就是不断调用fputc一个一个打印的。我们把fputc重定向到串口,那么printf自然就输出到串口。

4.main函数中调用

经过上面的步骤,printf已经移植完成。在主函数输入下面内容

cpp 复制代码
#include "stm32f10x.h"                  
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"

int main()
{
	OLED_Init();
	
	Serial_Init();
	
	printf("date:%d\r\n",20240312);
	while(1)
	{

	}
}

程序烧录后,单片机将会直接在串口输出 date:20240312 这行内容,并自动进行换行处理(\r\n)。

三、多串口使用printf

使用sprintf,sprintf可以把格式化字符输出到一个字符串里面。

cpp 复制代码
	char string[100];
	sprintf(string,"date:%d\r\n",2024031266);
	Serial_SendString(string);	//把字符串string通过串口发送出去
	//因为sprintf可以指定打印位置,不涉及重定向的东西,所以每个串口都可以使用sprintf进行格式化打印
	

四、封装sprintf

由于printf这类函数比较特殊,支持可变参数。

首先在串口的头文件里添加#include<stdarg.h>,然后在最末尾处对printf函数进行封装。

cpp 复制代码
void Serial_printf(char *format,...) //第一个参数用来接收格式化字符串 三个点用来接收可变参数列表
{
	char string[100];
	va_list arg;	//定义一个参数列表变量 va_list是类型名 arg是变量名
	va_start(arg,format);	//	从format位置开始接收参数表,放在arg里面
	vsprintf(string,format,arg);
	//这里的sprintf要改成vsprintf 前者只能接收直接写的参数 对于封装格式要用vsprintf
	va_end(arg);//释放参数表
	Serial_SendString(string);//把string发送出去
}

在main部分进行调用

cpp 复制代码
Serial_printf("date:%d\r\n",20240312);

输出结果如下

五、printf显示汉字的方法

在keil里面我们选择的汉字编码格式是utf8,所以发送到串口的时候汉字会以utf8的方式编码。在串口助手也得选择utf8才能解码正确,为了防止写入中文的时候编译器报错,需要先在小魔术棒里面的c/c++处输入下述参数。(这个步骤是针对于使用utf8的用户)

cpp 复制代码
--no-multibyte-chars

由于我编译器使用的是GB2312编码,所以串口助手处要使用GBK解码。如图,正确解码得到"你好,世界",中间的乱码部分是因为我选择了UTF8进行解码。

相关推荐
NineData14 分钟前
NineData数据库DevOps功能全面支持百度智能云向量数据库 VectorDB
数据库·人工智能·mysql
TDengine (老段)41 分钟前
TDengine 开发指南—— UDF函数
java·大数据·数据库·物联网·数据分析·tdengine·涛思数据
学习噢学个屁1 小时前
基于STM32物联网智能鱼缸智能家居系统
c语言·stm32·单片机·嵌入式硬件·物联网·智能家居
Waloo1 小时前
STUFF 函数
数据库·sql server
?ccc?2 小时前
MySQL故障排查与生产环境优化
数据库·mysql
一月千帆2 小时前
基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
stm32·单片机·嵌入式硬件
零叹2 小时前
篇章二 论坛系统——系统设计
数据库·数据库设计·技术选型·表的设计
重生之后端学习2 小时前
苍穹外卖-day03
java·开发语言·数据库·spring boot·mysql·spring·tomcat
快起来别睡了2 小时前
传统数据表创建与Prompt方式的对比:以NBA赛季投篮数据表设计为例
数据库·程序员
远方16092 小时前
21-Oracle 23 ai-Automatic SQL Plan Management(SPM)
数据库·sql·oracle