概述
进行C/C++开发的时候我们都会需要打印调试信息,打印调试信息时我们习惯使用printf函数,但是在Keil C51环境下,由于我们的程序是下载到单片机里,使用printf函数时不能直接打印到串口上,这个时候就需要我们对printf函数输出重定向。
重定向
重定向printf很简单,我们知道,printf函数是调用putchar实现字符数据传送的。我们只要重写putchar函数,就可以对printf进输出重定向。
代码清单
下面是自己在Keil 5环境下,使用单片机STC12测试printf重定向功能的代码清单
1 #include <STC12C5A60S2.H> 2 #include <stdio.h> 3 4 //UART1 初始化 5 void Uart1Init(void) //115200bps@11.0592MHz 6 { 7 PCON &= 0x7F; //波特率不倍速 8 SCON = 0x50; //8位数据,可变波特率 9 AUXR |= 0x04; //1T模式 10 BRT = 0xFD; //设置独立波特率发生器重装值 11 AUXR |=0X01; //串口1选择独立发生器为波特率发生器 12 AUXR |=0X10; //启动独立波特率发生器 13 ES = 1; //使能串口1中断 14 } 15 16 //UART1 发送串口数据 17 void UART1_SendData(char dat) 18 { 19 ES=0; //关串口中断 20 SBUF=dat; 21 while(TI!=1); //等待发送成功 22 TI=0; //清除发送中断标志 23 ES=1; //开串口中断 24 } 25 26 //UART1 发送字符串 27 void UART1_SendString(char *s) 28 { 29 while(*s)//检测字符串结束符 30 { 31 UART1_SendData(*s++);//发送当前字符 32 } 33 } 34 35 //重写putchar函数 36 char putchar(char c) 37 { 38 UART1_SendData(c); 39 return c; 40 } 41 42 void main(void) 43 { 44 Uart1Init(); 45 UART1_SendString("Hello World!\r\n"); 46 printf("printf Test!\r\n"); 47 printf("Complie Time:%s\r\n", __TIME__); 48 49 while(1) 50 { 51 } 52 }
打开串口把波特率调成115200bps,可以看到串口打印如下信息:
- Hello World!
- printf Test!
- Complie Time:11:12:36