51单片机重定向printf函数 打印数值不正确问题
串口一重定向printf函数
#include <STC12C5A60S2.H>
#include <stdio.h>
#include "usart.h" //函数的声明文件
#define boud 9600
#define sys_clk 11059200
//UART1 初始化
void Uart1Init(void)
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //1T模式
BRT = 256 - (int)(sys_clk/boud/32 + 0.5); //设置独立波特率发生器重装值
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函数 重定向printf
char putchar(char c)
{
UART1_SendData((unsigned char)c);
return c;
}
关于打印数值问题需注意 打印8,16,32位数据不能像PC机或者是32位位单片机那样,直接使用 %d,占位符,具体使用格式如下
void main(void)
{
unsigned char a = 10;
char b = -15 ;
unsigned short c = 20;
short d = -25;
unsigned int e = 65535;
int f = -32765;
Uart1Init();
while(1)
{
printf("a=%bu b=%bd c=%hu d=%hd e=%hu f=%hd \r\n",a,b,c,d,e,f);
Delay(100);
printf("\r\n size(a)=%bu,size(c)=%bu,size(e)=%bu \r\n" ,sizeof(a),sizeof(c),sizeof(e));
}
}
结果
a=10 b=-15 c=20 d=-25 e=65535 f=-32765
size(a)=1,size(c)=2,size(e)=2
关于占位符 8位 用bd/bu 16位用hd/hu 32用ld/lu
其中51单片机 所占字节数short=int=2个字节