Keil C51重定向printf到串口

来源:互联网 发布:侠客风云传 mac玩 编辑:程序博客网 时间:2024/04/27 20:07

概述

进行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


原创粉丝点击