单片机C51串口printf的使用方法

串口printf的使用

函数原型如下:

void USART0_Printf(char *fmt,...)//这个是我们的printf函数

{

 char* ap;  //typedef char *va_list; va_list是char型的指针

 charxdata string[128];  //访问外部RAM 两字节对齐

 va_start(ap,fmt);  //这个函数的功能是,找到第一个可变形参的地址,并把地址赋给ap

 vsprintf(string,fmt,ap);

 USART0_SendString(string);  //这个函数就是发送字符串函数,通过上一个函数,就把该提取的东西都提取了

 va_end(ap);  //结束函数

}

这个函数在51调试的时候还是非常好用的,特别是又用串口ISP下载的用户。接下来简述下函数的用法:

1、在编写函数之前,首先需要添加stdarg.h头文件,其中va_start和va_end函数就是这个里面的库。


2、其次就是需要分配一个空间,例如上面的char xdata string[128]; 因为空间有限,我这里给的是外部128字节。打印的长度超出了可能就会出问题了,根据情况,在空间充足的情况下可以分配大一点。


3、编写底层的串口打印字符串函数,在51的程序里我一般写成如下:

//串口0发送一个字节

void USART0_SendByte(u8 value)

{

       SBUF= value;  //发送一个字节                         

       while(!TI);   //等待TI置1              

              TI=0;                                 

}

//串口0发送字符串

void USART0_SendString(u8 *dat)

{

       while(*dat!='\0')

              USART0_SendByte(*dat++);

}

这是串口0的打印函数,如果换成串口1也是一样的。

在使用的过程中需要注意有数据的情况下,数据需要强转成int型不能直接用unsigned char,这个不是我今天所遇到的问题,在上学期间实践过,所以使用的时候我都加了强转,例如:

USART0_Printf("PWR_LEVEL=%d  MOD_LEVEL=%d  FAN_LEVEL=%d TIME_LEVEL=%d FUN_LEVEL=%d\n",

                           (int)PWR_LEVEL,(int)MOD_LEVEL,(int)FAN_LEVEL,(int)TIM_LEVEL,(int)FUN_LEVEL);


转自:https://blog.csdn.net/qq997758497/article/details/77411404

你可能感兴趣的:(C/C++)