STM32串口格式化输出的几种方法介绍

电子说

1.3w人已加入

描述

在前两天介绍的串口输出中,函数Usart1_SendStr只能输出字符串,如果想输出一个整型或者其他类型的数据,单独用这个函数是不能实现的。今天跟大家简单介绍下格式化输出,让输出不再只有字符串。

格式化输出有****3种方法 :sprintf结合usart输出;使用MicroLIB调用printf输出;重定向输出。

1、sprintf结合usart输出

sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。

函数原型

int sprintf( char *buffer, const char *format, [ argument] … );

参数列表:

buffer :char型指针,指向将要写入的字符串的缓冲区。

format :格式化字符串。

[argument]... :可选参数,可以是任何类型的数据。

通过sprintf把想要输出的数据格式化为字符串数据,再调用Usart1_SendStr就能输出任意想要输出的数据了。

2、使用MicroLIB调用printf输出

STM32

勾选Use MicroLIB,调用printf,再开启半主机模式,就可以输出数据了。但是使用MicroLIB存在bug,在跑操作系统时偶尔会出现死机的现象,所以这种方法不推荐使用。

3、重定向输出

STM32

在Keil的下载路径下找到Retarget.c文件,打开并复制整个文件,粘贴到串口源文件中,做一定的修改,如下所示。

#pragma import(__use_no_semihosting_swi)


struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;


int fputc(int ch, FILE *f) {
  while((USART1- >SR & (1< < 7)) == 0);
  USART1- >DR = ch;
  return ch;
}


int ferror(FILE *f) {
  /* Your implementation of ferror */
  return EOF;
}


void _sys_exit(int return_code) {
  while (1);    /* endless loop */
}

修改完成后,就可以直接调用printf输出任意类型的数据了。这种方法跑操作系统时不会有bug,为了避免后期跑操作系统出现死机或其它bug,推荐使用这种重定向输出的方法。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分