zoukankan      html  css  js  c++  java
  • 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;      //非忙
      } 
    }
  • 相关阅读:
    集合:HashMap原理
    监控管理
    jvm(内存分配和回收策略、字节码执行引擎、运行时栈的结构)
    jvm:收集器
    多线程(线程的四种创建方式)
    scrapy之下载器中间件(Download Middleware)
    scrapy之Spider
    Scrapy之原理&提取数据
    小程序之请求服务器资源注意问题
    小程序之页面跳转
  • 原文地址:https://www.cnblogs.com/ownDefine/p/10873625.html
Copyright © 2011-2022 走看看