Keil C51重定向printf到串口

概述

进行C/C++开发的时候我们都会需要打印调试信息,打印调试信息时我们习惯使用printf函数,但是在Keil C51环境下,由于我们的程序是下载到单片机里,使用printf函数时不能直接打印到串口上,这个时候就需要我们对printf函数输出重定向。

重定向

重定向printf很简单,我们知道,printf函数是调用putchar实现字符数据传送的。我们只要重写putchar函数,就可以对printf进输出重定向

代码清单

下面是自己在Keil 5环境下,使用单片机STC89C52/52RC测试printf重定向功能的代码清单

#include <reg52.h>
  #include <stdio.h>
   
  #define uint unsigned int
  #define uchar unsigned char
   
  uchar flag = 0;
  uchar buf = 0x55;
   
  void init_T1()
  {
  TMOD = 0x20;
  TH1 = 0xfd;
  TL1 = 0xfd;
  TR1 = 1;
  }
   
  void uart_init()
  {
  SM0 = 0;
  SM1 = 1;
  REN = 1;
  EA = 1;
  ES = 1;
  }
   
  //UART1 发送串口数据
  void UART1_SendData(char dat)
  {
  ES=0; //关串口中断
  SBUF=dat;
  while(TI!=1); //等待发送成功
  TI=0; //清除发送中断标志
  ES=1; //开串口中断
  }
   
  //UART1 发送字符串
  void UART1_SendString(char *s)
  {
  while(*s)//检测字符串结束符
  {
  UART1_SendData(*s++);//发送当前字符
  }
  }
   
  //重写putchar函数
  char putchar(char c) //printf函数会调用putchar()
  {
  UART1_SendData(c);
  return c;
  }
   
  void main()
  {
  init_T1();
  uart_init();
  UART1_SendString("Hello World!\r\n");
  printf("printf Test!\r\n");
  printf("Complie Time:%s\r\n", __TIME__);
   
  while(1)
  {
  if(flag)
  {
  ES = 0;
   
  SBUF = buf;
  while(TI ==1)
  TI = 0;
  ES = 1;
  flag = 0;
  }
  }
  }
   
  void UART_isr(void) interrupt 4 using 0
  {
  TI = 1;
  buf = SBUF;
  while(!RI);
  flag = 1;
  TI = 0;
  RI = 0;
  }

打开串口把波特率调成115200bps(不对的话调成9600),可以看到串口打印如下信息:

Hello World! 
printf Test! 
Complie Time:11:12:36


  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值