实例6---程序调试助手printf-----程序目的:如何利用标准库实现printf函数
printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。
printf(“格式控制字符串”, 输出表列)
其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x或者%X 无符号以十六进制表示的整数,小写则输出小写,大写则输出大写
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法
%p 输出地址符
如果这个是在VC环境下,printf就可以直接使用。那在MSP430的平台下如何实现,下面我们就来编写程序,首先确定的就是printf我们调用的是IAR环境下的标准库函数,那么我们只要写个底层就可以了,也是就我们写个putchar函数即可,不了解putchar函数的同学自己问下度娘,putchar函数如下:
//向终端输出一个字符
int putchar(int c)
{
if(c == '\n')
{
UCA0TXBUF = '\r';
while(!(IFG2 & UCA0TXIFG));
}
UCA0TXBUF = c;
while(!(IFG2 & UCA0TXIFG));
return c;
}
注意形式参数与函数类型都是int型,不要更改这个数据类型,否则不兼容。这个我们可以看下printf的声明
__EFF_NW1 __PRINTFPR __ATTRIBUTES int printf(const char *_Restrict, ...);
下面我们看演示程序:
在我们上节课的uart.c的文件里我们添加putchar函数
//UART0底层驱动文件
#include <msp430f249.h>
#include "uart.h"
//串口0初始化 波特率9600
void Uart0_Init(void)
{
P3SEL |= 0x30;//设置P3.4与P3.5为串口TXD/RXD
UCA0CTL1 |= UCSSEL0 + UCSWRST;//设置串口0时钟为ACLK,置位UCSWRST,初始化所有的USCI寄存器
UCA0BR0 = 0x03;//32768Hz/9600=3.41
UCA0BR1 = 0x00;
UCA0MCTL = UCBRS1 + UCBRS0;//UCBRSx=0.41*8=3.28
UCA0CTL1 &= ~UCSWRST;//清除UCSWRST位
IE2 |= UCA0RXIE;//接收中断使能位
}
//串口0发送数据
void Uart0_Send_Byte(u8 data)
{
while(!(IFG2&UCA0TXIFG));//发送寄存器空的时候发送数据
UCA0TXBUF = data;
}
//向终端输出一个字符
int putchar(int c)
{
if(c == '\n')
{
UCA0TXBUF = '\r';
while(!(IFG2 & UCA0TXIFG));
}
UCA0TXBUF = c;
while(!(IFG2 & UCA0TXIFG));
return c;
}
//串口0接收中断
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
u8 data=0;
data = UCA0RXBUF;//接收到的数据存起来
Uart0_Send_Byte(data);//将接收到的数据再发送出去
}
//主函数
#include <msp430f249.h>
#include "msp430type.h"
#include "system.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "exti.h"
#include "uart.h"
//主函数
void main(void)
{
Wdt_Off();//关闭看门狗
Clock_Init();//系统时钟初始化
Led_Init();//led灯初始化
Key_Init();//按键初始化
Uart0_Init();//串口0初始化 波特率9600
_BIS_SR(GIE);//使能总中断
while(1)
{
printf("标准库printf函数发送数据到终端测试\r\n");
LED_L;//点亮led灯
Delay_ms(200);
LED_H;//熄灭led灯
Delay_ms(200);
}
}
主函数很简单,就是不断发送字符串,led灯不断闪烁。上图看下串口调试助手有没有收到数据。
其他的格式输出大家自己去验证,这里就不一一演示了。
printf函数实现课程完结。源程序: 006 uart-printf.rar 学习讨论Q群:167390222 2014年7月5日