极海半导体的APM32F103ZET6的mini板上实现格式化输出数据的4种方法,配置总结方法如下:
	 
|  | 
						包含头文件 | 
						Use MicroLib | 
						重定向c库函数 | 
						使用半主机 | 
						自定义格式化输出函数 | 
| 
						直接使用printf | 
						stdio.h | 
						√ | 
						√ | 
						× | 
						× | 
| 
						× | 
						√ | 
						√ | 
						× | ||
| 
						自行编写USART1Printf | 
						stdarg.h    | 
						√ | 
						× | 
						× | 
						√ | 
| 
						× | 
						× | 
						√ | 
						√ | 
1 方法一:printf + Use MicroLIB1.1 配置Keil工程
1.2 在完成好初始化串口的代码上包含头文件、添加代码
	#include "stdio.h"
	//重定向c库函数printf到串口,重定向后可使用printf函数
	int fputc(int ch, FILE *f)
	{
	     USART_TxData(USART1,(char) ch);
	     while(USART_ReadStatusFlag(USART1,USART_FLAG_TXBE) == RESET);
	     return(ch);
	}
	//重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
	int fgetc(FILE *f)
	{
	     while(USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == RESET);
	     return(int)USART_RxData(USART1);
	}
	1.3 编写测试代码,连接好串口,现象如下:
	测试代码:printf("begin\n\r");
	测试现象:
	2 方法二:pritnf +  Not Use MicroLib2.1 配置Keil工程
	2.2 在完成好初始化串口的代码上包含头文件、添加代码
	#include "stdio.h"
	#pragma import(__use_no_semihosting) //这条语句可以关闭半主机模式               
	//标准库需要的支持函数                 
	struct __FILE
	{
	     inthandle;
	};
	FILE __stdout;      
	//定义_sys_exit()以避免使用半主机模式   
	void _sys_exit(int x)
	{
	     x = x;
	}
	//重定向c库函数printf到串口,重定向后可使用printf函数
	int fputc(int ch, FILE *f)
	{
	     USART_TxData(USART1,(char) ch);
	     while(USART_ReadStatusFlag(USART1,USART_FLAG_TXBE) == RESET);
	     return(ch);
	}
	//重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
	int fgetc(FILE *f)
	{
	     while(USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == RESET);
	     return(int)USART_RxData(USART1);
	}
	2.3 编写测试代码,连接好串口,现象如下:
	测试代码:printf("begin\n\r");
	测试现象:
	3 方法三:自行撰写USART1Printf+ Use MicroLIB3.1 配置Keil工程
	3.2 在完成好初始化串口的代码上包含头文件、添加代码
	#include <stdarg.h>   
	void TP_USART1SendString(char *s)
	{
	  while (*s!= '\0')
	  {
	     USART_TxData(USART1,*s);
	     while(USART_ReadStatusFlag(USART1,USART_FLAG_TXBE) == RESET);   
	    s++;  
	  }
	}
	void USART1Printf(char *fmt,...)
	{
	     __va_listap;
	     charstring[400];
	     va_start(ap,fmt);
	     vsprintf(string,fmt,ap);   
	     TP_USART1SendString(string);
	     va_end(ap);   
	}
	3.3 编写测试代码,连接好串口,现象如下:
	测试代码:USART1Printf ("begin\n\r");
	测试现象:
	4 方法四:自行编写USART1Printf+ Not Use MicroLIB4.1 配置Keil工程
	4.2 在完成好初始化串口的代码上包含头文件、添加代码
	#include <stdarg.h>   
	#pragmaimport(__use_no_semihosting) //这条语句可以关闭半主机模式               
	//标准库需要的支持函数                 
	struct __FILE
	{
	     inthandle;
	};
	FILE __stdout;      
	//定义_sys_exit()以避免使用半主机模式   
	void _sys_exit(int x)
	{
	     x = x;
	}
	void TP_USART1SendString(char *s)
	{
	  while (*s!= '\0')
	  {
	     USART_TxData(USART1,*s);
	     while(USART_ReadStatusFlag(USART1,USART_FLAG_TXBE) == RESET);   
	    s++;  
	  }
	}
	4.3 编写测试代码,连接好串口:
	测试代码:USART1Printf ("begin\n\r");
	测试现象
 
    
 
   
   
   
  