概述
进行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到串口
推荐阅读最新更新时间:2024-03-16 16:05
原子的串口ISP一键下载研究
把我弄晕了,CH340的DTR和RTS。。。 原子的原ISP一键下载图: 《STM32F1开发指南-库函数版本_V3.1 》中对下载电路的解释: 更直观的解释应该上张图: 总而言之,就是对BOOT0和BOOT1的赋值,为了简化电路,把BOOT1下拉到地,只需要控制BOOT0即可。 有个问题,不容忽视,复位完之后,进入ISP下载程序,下载完之后,并没有再用上位机控制BOOT0,反而也可以直接执行程序。 网上有人这样解释, 说实话不太能懂。 下载完之后,两个三极管断开,BOOT0,BOOT1全部被硬件上的电阻拉低,然后自动进入了运行模式?!~ 附一张今天刚列的直观理解图,注意了,刚看的时候,一直有
[单片机]
msp430的printf函数的简单移植
这几个月都在做一个基于TCS34725的RGB颜色传感器的工程,我使用的主控是MSP430,平时调试的时候用485总线发送到上位计(电脑或上层主控机),开始直接用串口发送函数直接发送,但是很多数据显示超级不方便,比如浮点数和有特地格式的数据流,先前都是自己用串口发送函数组一函数就是调用了int putchar(char *) 函数,于是我花了几分钟写了一个putchar函数,已使用,还真的成功了…….,想想先前傻逼的一个一个的构造格式,转化数字为字符串,现在终于可以使用printf函数了…. int putchar(int ch) { if (ch == 'n') { RS485Send
[单片机]
C51---9 LED点阵屏
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
[单片机]