MCU中printf重定向實現


// 添加頭文件
#include "stdio.h"  
#include "stdarg.h"   
     
//全局變量
bit TI_busy;
unsigned char idata putBuf[100];  //最大數量
 
/*  idata注釋:
  定義一個字節型的變量,這個變量保存在RAM的idata區.單片機的存儲主要分為四個區域:data、idata、code、xdata。
  data區:單片機能直接訪問的 直接尋址RAM區,00H-7FH
  idata區:單片機間接防問的RAM區,80H-FFH
  code區:單片機的內部程序存儲區,也就是單片機內置的FALSH
  xdata區:單片機外部尋址區,一般指片外的存儲器,0000H-FFFFH
*/
 
// 串口打印函數實現 
void debug_printf(char* fmt,...)
  unsigned char i,len;
 
     va_list ap;                  //定義變量為字符指針
  va_start(ap, fmt);              //獲取可變參數列表的第一個參數的地址
     len = vsprintf((char*)putBuf, fmt, ap);     //將可變列表拷貝至緩沖區
  va_end(ap);                //清空va_list可變參數列表
  
  for(i = 0; i < len; i++)         //把緩存內的字符發送出去
   {   
    while( TI_busy );                //等待前面的數據發送完成  
    TI_busy = 1;   
    SBUF = putBuf[i];      //發送一個字節
   } 
  memSet(putBuf, 0, sizeof(putBuf));   //清空緩存(自己實現)
}
   
//main入口函數
void main()  
 { 
  unsigned int i; 
  UartInit();         //串口初始化
  EA=1;          //開總中斷  
  while(1)
   { 
     debug_printf(" Hello World ! ");  
    debug_printf("  i = %03d, 0x%03X\r\n", i, i++);  
    delayMs(1000); 
  }
 
//中斷處理函數    
void Uart1() interrupt 4 
  if(RI)            //接收
    RI = 0;         //清標志  
  else            //發送
  {   
    TI = 0;         //清標志  
    TI_busy = 0;      //非忙
  } 
}


免責聲明!

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



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