• 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;      //非忙
      } 
    }
  • 相关阅读:
    c# 判断点在区域内,外
    数据库行转列的sql语句
    正则表达式 mac 地址 匹配
    js check (转)
    MessageBox 确认对话框
    获得 客户端信息(IP && Mac)
    根据 标识 自动编号
    行转列 demo
    dataset 中 datatable 关联查询
    ACM 进阶指南
  • 原文地址:https://www.cnblogs.com/ownDefine/p/10873625.html
Copyright © 2020-2023  润新知