在CCS3.3调试时如何使用printf()函数呢?
方法一:重定向printf
#include
/**----------------------------------------------
* @brief * @retval none
------------------------------------------------*/
int fputc(int ch, FILE *f)
{
//串口发送函数
Uart_SendChar(ch);
return ch;
}
方法二: 仿照printf自己写一个
/**-----------------------------------------------------------
*@brief 实现格式化的打印功能(仿printf)
-------------------------------------------------------------*/
#include
#include
#include
#define MAX_NUM_LEN 10 /*最大显示位数-----*/
const char digits[] = "0123456789ABCDEF";
/**-----------------------------------------------------------
*@brief 显示终端上输出一个字符(实现print函数的移植接口)
-------------------------------------------------------------*/
static void PutChar(char c)
{
/*-------------------------write here------------------------*/
printf("%c",c);//串口发送函数
}
/**-----------------------------------------------------------
*@brief 显示终端上输出一个字符串
-------------------------------------------------------------*/
static void PutStr(const char *str)
{
while ( *str != '\0' )PutChar(*str++);
}
/**-----------------------------------------------------------
*@brief 在显示终端上打印数值
*@param num:显示值,base:显示值的基数,二进制、八进制、十进制..
-------------------------------------------------------------*/
static void PrintNum(long num, char base)
{
char numStr[MAX_NUM_LEN]; /*数值字符串缓冲区---*/
char i = 0; /*for numStr---------*/
if (base 16)return;
while (num) /*将数值转换成字符串--*/
{
numStr[i++] = digits[num % base]; /*得到的是颠倒的串--*/
num /= base; /*去掉最低位---------*/
}
while (i--) /*反向打印----------*/
{
PutChar(numStr);
}
}
/**-----------------------------------------------------------
*@brief 实现类型于printf函数的格式化输出
*@attention 不支持符点
-------------------------------------------------------------*/
void print(const char *fmt, ...)
{
char c;
va_list var_arg;
/**
**@准备访问可变参数
*/
va_start( var_arg, fmt );
while ( (c = *fmt++) != '\0' )
{
if (c != '%')
{
PutChar(c);
continue;
}
switch (*fmt++)
{
case 'C':
case 'c': /*字符型-----------------*/
{
PutChar( va_arg(var_arg, int) );
}
break;
case 'D':
case 'd': /*整型-------------------*/
{
PrintNum(va_arg(var_arg, int), 10);
}break;
case 'S':
case 's': /*字符串型----------------*/
{
PutStr(va_arg(var_arg, char *));
}break;
case 'X': /*十六进制----------------*/
case 'x':
{
PrintNum(va_arg(var_arg, int), 16);
}break;
case 'O': /*八进制-----------------*/
case 'o':
{
PrintNum(va_arg(var_arg, int), 8);
}break;
case 'B':
case 'b': /*二进制------------------*/
{
PrintNum(va_arg(var_arg, int), 2);
}break;
default:
{
PutChar(c); /*未定义,直接打印----------*/
}
}
}
/**
**@完成处理可变参数
*/
va_end ( var_arg );
}
int main(int argc, char** argv)
{
char *str="hello"; //字符串
int v_dec = 12345; //十进制
int v_hex = 0x12345; //十六进制
int v_o = 012345; //八进制
int v_b = 0x55; //二进制
print("str:%s\n v_dec = %d\n v_hex = 0x%X\n v_o = %o\n v_b = %b\n",str,v_dec,v_hex,v_o,v_b);
return 0;
}
控制台输出:
str:hello
v_dec = 12345
v_hex = 0x12345
v_o = 12345
v_b = 1010101
--------------------------------
Process exited with return value 0
Press any key to continue . . .
这个程序也太长了,楼上