实现的原理:就是找到 printf 和scanf函数的输入/输出端的接口函数把它修改定向到串口。
/** @copyright Copyright(c)2014-2011 XXXX Co.,Ltd. All rights reserved.
******************************************************************************
* @file uart_format.c
* @brief
* @details
* @author 匠在江湖(ID:1234)
* @version V1.0
* @date 2014/05/08
******************************************************************************
* @attention
*
* @par 修改日志:
* <table>
* <tr><th>Date <th>Version <th>Author(ID:xxxxxx) <th>Description</tr>
* <tr><td>2014/05/08 <td>V1.0 <td>匠在江湖(ID:1234) <td>创建初始版本</tr>
* </table>
******************************************************************************
*/
/* Includes *******************************************************************/
#include <stdio.h>
#include "mcu.h"
/* Private typedef ************************************************************/
/* Private constants **********************************************************/
/* Private macro **************************************************************/
#define UART_FORMAT_TDR SBUF //发送数据寄存器
#define UART_FORMAT_TDIF_READ() TI //发送数据寄存器为空置1,反之0。写 发送数据寄存器 清该标志
#define UART_FORMAT_TDIF_CLR() TI = 0 //清发送数据完成中断标志
#define UART_FORMAT_RDR SBUF //接收数据寄存器
#define UART_FORMAT_RDIF_READ() RI //接收数据寄存器不为空置1,反之0。读 接收数据寄存器 清该标志
#define UART_FORMAT_RDIF_CLR() RI = 0 //清接收数据完成中断标志
/* Private variables **********************************************************/
/* Private function prototypes ************************************************/
/**
******************************************************************************
* @brief 重定向<stdio.h>库 输出端口 函数
* @param ch 待发送数据
* @return 返回发送数据
* @note printf到串口
******************************************************************************
*/
char putchar(char ch)
{
UART_FORMAT_TDIF_CLR(); //清TDIF标志
UART_FORMAT_TDR = ch; //写 发送数据寄存器
while( !UART_FORMAT_TDIF_READ() ); //等待 发送数据寄存器 为空
return ch; //返回发送数据
}
/**
******************************************************************************
* @brief 重定向<stdio.h>库 输入端口 函数
* @param None
* @return 返回接收数据
* @note 串口到scanf
******************************************************************************
*/
char _getkey(void)
{
char ch;
while( !UART_FORMAT_RDIF_READ() ); //等待 接收数据寄存器 不为空
ch = UART_FORMAT_RDR; //读 接收数据寄存器
UART_FORMAT_RDIF_CLR(); //RDIF标志
return ch; //返回接收数据
}
/********************************* END OF FILE ********************************/