【轉】 Keil C51重定向printf到串口


概述

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

 

來源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM