概述
进行C/C++开发的时候我们都会需要打印调试信息,打印调试信息时我们习惯使用printf函数,但是在Keil C51环境下,由于我们的程序是下载到单片机里,使用printf函数时不能直接打印到串口上,这个时候就需要我们对printf函数输出重定向。
重定向
重定向printf很简单,我们知道,printf函数是调用putchar实现字符数据传送的。我们只要重写putchar函数,就可以对printf进输出重定向
代码清单
下面是自己在Keil 5环境下,使用单片机STC89C52/52RC测试printf重定向功能的代码清单
#include <reg52.h> | |
#include <stdio.h> | |
#define uint unsigned int | |
#define uchar unsigned char | |
uchar flag = 0; | |
uchar buf = 0x55; | |
void init_T1() | |
{ | |
TMOD = 0x20; | |
TH1 = 0xfd; | |
TL1 = 0xfd; | |
TR1 = 1; | |
} | |
void uart_init() | |
{ | |
SM0 = 0; | |
SM1 = 1; | |
REN = 1; | |
EA = 1; | |
ES = 1; | |
} | |
//UART1 发送串口数据 | |
void UART1_SendData(char dat) | |
{ | |
ES=0; //关串口中断 | |
SBUF=dat; | |
while(TI!=1); //等待发送成功 | |
TI=0; //清除发送中断标志 | |
ES=1; //开串口中断 | |
} | |
//UART1 发送字符串 | |
void UART1_SendString(char *s) | |
{ | |
while(*s)//检测字符串结束符 | |
{ | |
UART1_SendData(*s++);//发送当前字符 | |
} | |
} | |
//重写putchar函数 | |
char putchar(char c) //printf函数会调用putchar() | |
{ | |
UART1_SendData(c); | |
return c; | |
} | |
void main() | |
{ | |
init_T1(); | |
uart_init(); | |
UART1_SendString("Hello World!\r\n"); | |
printf("printf Test!\r\n"); | |
printf("Complie Time:%s\r\n", __TIME__); | |
while(1) | |
{ | |
if(flag) | |
{ | |
ES = 0; | |
SBUF = buf; | |
while(TI ==1) | |
TI = 0; | |
ES = 1; | |
flag = 0; | |
} | |
} | |
} | |
void UART_isr(void) interrupt 4 using 0 | |
{ | |
TI = 1; | |
buf = SBUF; | |
while(!RI); | |
flag = 1; | |
TI = 0; | |
RI = 0; | |
} |
打开串口把波特率调成115200bps(不对的话调成9600),可以看到串口打印如下信息:
Hello World!
printf Test!
Complie Time:11:12:36