Keil C51重定向printf到串口

发布者:EtherealJourney最新更新时间:2018-06-10 来源: eefocus关键字:Keil  C51  重定向  printf  串口 手机看文章 扫描二维码
随时随地手机看文章

概述

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

重定向

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

代码清单

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

#include

#include


//UART1 初始化

void Uart1Init(void)    //115200bps@11.0592MHz

{

    PCON &= 0x7F;       //波特率不倍速

    SCON    = 0x50;     //8位数据,可变波特率

    AUXR |= 0x04;       //1T模式

    BRT     = 0xFD;     //设置独立波特率发生器重装值

    AUXR |=0X01;        //串口1选择独立发生器为波特率发生器

    AUXR |=0X10;        //启动独立波特率发生器

    ES = 1;                 //使能串口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)

{

    UART1_SendData(c);

    return c;

}


void main(void)

{

    Uart1Init();

    UART1_SendString("Hello World!\r\n");

    printf("printf Test!\r\n");

    printf("Complie Time:%s\r\n", __TIME__);


    while(1)

    {

    }

}

打开串口把波特率调成115200bps,可以看到串口打印如下信息:

Hello World! 

printf Test! 

Complie Time:11:12:36

关键字:Keil  C51  重定向  printf  串口 引用地址:Keil C51重定向printf到串口

上一篇:51单片机串口通信 采用中断方式
下一篇:51单片机定时器中断函数中变量初始化的问题

推荐阅读最新更新时间:2024-03-16 16:05

原子的串口ISP一键下载研究
把我弄晕了,CH340的DTR和RTS。。。 原子的原ISP一键下载图: 《STM32F1开发指南-库函数版本_V3.1 》中对下载电路的解释: 更直观的解释应该上张图: 总而言之,就是对BOOT0和BOOT1的赋值,为了简化电路,把BOOT1下拉到地,只需要控制BOOT0即可。 有个问题,不容忽视,复位完之后,进入ISP下载程序,下载完之后,并没有再用上位机控制BOOT0,反而也可以直接执行程序。 网上有人这样解释, 说实话不太能懂。 下载完之后,两个三极管断开,BOOT0,BOOT1全部被硬件上的电阻拉低,然后自动进入了运行模式?!~ 附一张今天刚列的直观理解图,注意了,刚看的时候,一直有
[单片机]
原子的<font color='red'>串口</font>ISP一键下载研究
msp430的printf函数的简单移植
这几个月都在做一个基于TCS34725的RGB颜色传感器的工程,我使用的主控是MSP430,平时调试的时候用485总线发送到上位计(电脑或上层主控机),开始直接用串口发送函数直接发送,但是很多数据显示超级不方便,比如浮点数和有特地格式的数据流,先前都是自己用串口发送函数组一函数就是调用了int putchar(char *) 函数,于是我花了几分钟写了一个putchar函数,已使用,还真的成功了…….,想想先前傻逼的一个一个的构造格式,转化数字为字符串,现在终于可以使用printf函数了…. int putchar(int ch) { if (ch == 'n') { RS485Send
[单片机]
C51---9 LED点阵屏
LED点阵屏介绍
[单片机]
C51---9 LED点阵屏
STM32串口USART1中断接收和中断发送
  先贴出中断函数:    view plain copy   void USART1_IRQHandler(void){   IF (USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET) {   USART_ClearITPendingBit(USART1, USART_IT_RXNE);   USART1_Buffer =USART_ReceiveData(USART1); //USART1_Buffesh是一个自己定义的接收数组   if(i 3){   SendFlag = 1;   }   }   if(USART_GetITStatus(USART1, USART_I
[单片机]
Keil C51中的启动程序startup.a51最新中文说明!
Keil C51中的启动程序startup.a51最新中文说明! 由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下: ;--------------------------------------------------- ;startup.A51: 用户上电初始化程序 ;---------------------------------------------------- ; ;使用以下EQU命令可定义在CPU复位时需要用0进行初始化的内存空间 ; ;IDATA存储器的空间的绝对
[单片机]
C51编程经验汇总分享
  在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种。用惯了汇编的人,总觉得高级语言“可控性”不好,不如汇编那样随心所欲。以下是笔者在C51编程中的几点经验,希望对初学C51者有所帮助。   一、C51热启动代码的编制   工业控制计算机,往往设有看门狗电路,看门狗动作,计算机复位,这就是热启动。热启动时,一般不允许程序从头开始,因为这将使测量或计算值复位,导致系 统工作异常。故程序必须判断是热启动还是冷启动。常用的方法是:设定某内存单位为标志位(如0x7f位和0x7e位),启动时首先读该内存单元的内容,如 果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动,程序执行初始化部分
[单片机]
国产MCU的GD32E230串口通信
之前一直使用ST的STM32F031单片机,但是由于疫情还是啥啥原因,ST的芯片价格涨得没法看,因为我们是做产品,而且量比较大,ST的芯片就无法再用了,这个成本真的扛不起。 于是在很多国产MCU里面做了甄选,最终GD的因为新能优越,价格便宜获选。GD32E230对标的STM32F031,实现了PIN TO PIN兼容,寄存器不是完全兼容,但是GD的主频可以实现72M,这就很恐怖,STM32F031才48M,之前还得超频到56M使用。不得不说,GD强! 仅仅对比固件库,GD的库函数封装的比ST的库要好很多,当然,ST现在主推HAL库,这个HAL库确实也很好。 在使用串口之前同样要配置引脚,时钟。 GPIO引脚配置 void
[单片机]
国产MCU的GD32E230<font color='red'>串口</font>通信
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved