概述
進行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