对于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进行解码。

相关推荐
C***11504 分钟前
Spring TransactionTemplate 深入解析与高级用法
java·数据库·spring
+VX:Fegn089519 分钟前
计算机毕业设计|基于springboot + vue建筑材料管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
2301_8002561122 分钟前
B+树:数据库的基石 R树:空间数据的索引专家 四叉树:空间划分的网格大师
数据结构·数据库·b树·机器学习·postgresql·r-tree
点灯小铭28 分钟前
基于单片机的智能收银机模拟系统设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计·期末大作业
TEC_INO33 分钟前
STM32_9:I2C_DHT11_OLED项目
stm32·单片机·嵌入式硬件
__万波__35 分钟前
STM32基于HAL 库开发包创建新的工程-编译-烧录
stm32·单片机·嵌入式硬件
大厂技术总监下海44 分钟前
用户行为分析怎么做?ClickHouse + 嵌套数据结构,轻松处理复杂事件
大数据·数据结构·数据库
曾浩轩1 小时前
跟着江协科技学STM32之4-5OLED模块教程OLED显示原理
科技·stm32·单片机·嵌入式硬件·学习
alonewolf_991 小时前
深入理解MySQL事务与锁机制:从原理到实践
android·数据库·mysql
BreezeJuvenile1 小时前
ADC_案例练习:独立模式多通道采集
stm32·单片机·adc·多通道采集·dma辅助