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 ", i, i++);  
    delayMs(1000); 
  }
 
//中断处理函数    
void Uart1() interrupt 4 
  if(RI)            //接收
    RI = 0;         //清标志  
  else            //发送
  {   
    TI = 0;         //清标志  
    TI_busy = 0;      //非忙
  } 
}
原文地址:https://www.cnblogs.com/ownDefine/p/10873625.html