C log代码
本文地址:http://dsyn.tongxinmao.com/Article/Detail/id/298
//转自https://www.amobbs.com/thread-5687433-1-1.html?_dsign=f99f1341
#ifndef __DEBUG_H
#define __DEBUG_H
#include "stdarg.h"
#define SHORT_FILE strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__
#define _STR(s) #s
#define STR(s) _STR(s)
#define LOG_OUT //定义 LOG_OUT,则打开调试
#define LOG_INFO 1 // =1 打开LOG_INFO;=0 关闭LOG_INFO
#define LOG_DEBUG 1 // =1 打开LOG_DEBUG;=0 关闭LOG_DEBUG
#define LOG_TRACE 1 // =1 打开LOG_TRACE;=0 关闭LOG_TRACE
#define LOG_ERROR 1 // =1 打开LOG_ERROR;=0 关闭LOG_ERROR
#define LOG_Send USART1_Send //USART2_Send //USB_TxWrite //定义log输出通道
void _printf( u8 *Data,...);
#ifdef LOG_OUT
#define LOG(level, format, ...) do { \
if(level==1) \
_printf("[%s][%s@%s,%d] " format "\r\n", \
_STR(_##level), __func__, SHORT_FILE, __LINE__, ##__VA_ARGS__ ); } \
while (0)
#else
#define LOG(level, format, ...)
#endif
#endif
#include "debug.h"
#include "bsp_usart1.h" //对应的bsp_usart1.c这里面实现了void USART1_Send(uint8_t *pbuffer, uint32_t size)
static u8 DebugBuffer[255];
static u8 DebugSize;
/********************************************************
* 函数名:itoa
* 描述 :将整形数据转换成字符串,支持2-16进制,支持负数
* 输入 :-radix =10 表示10进制,
* -value 要转换的整形数
* -buf 转换后的字符串
* -radix = 10
*******************************************************/
static char *itoa(signed int num, char *str, int radix)
{
char string[] = "0123456789ABCDEF";
char* ptr = str;
char temp;
int i;
int j;
if(radix<2||radix>16)//增加了对错误的检测
{
return str;
}
if (num < 0)
{
/* Make the value positive. */
num = -num;
}
do{
*ptr++ = string[num % radix];
num /= radix;
}while (num);
j = ptr - str-1;
for (i = 0; i < (ptr - str) / 2; i++)
{
temp = str[i];
str[i] = str[j];
str[j--] = temp;
}
j = ptr - str-1;
if(num<0)
{
for(i=j;i==0;i--)
{
str[i+1]=str[i];
}
str[0]='-';
str[j+2]=0;
}
else
{
str[j+1]=0;
}
return str;
}
/************************************************************************
* 函数名:_printf
* 描述 :格式化输出,类似于C库中的printf,但这里没有用到C库
* -Data 要发送到串口的内容的指针
* -... 其他参数
* 输出 :无
* 返回 :无
* 调用 :外部调用
* 典型应用_printf( "\r\n this is a demo \r\n" );
* _printf( "\r\n %d \r\n", i );
* _printf( "\r\n %s \r\n", j );
***************************************************************************/
void _printf( u8 *Data,...)
{
const char *s;
int d;
char buf[20];
va_list ap;
va_start(ap, Data);
DebugSize = 0;
while ( *Data != 0) // 判断是否到达字符串结束符
{
if ( *Data == 0x5c ) //'\'
{
switch ( *++Data )
{
case 'r': //回车符
DebugBuffer[DebugSize++]=0x0d;
Data ++;
break;
case 'n': //换行符
DebugBuffer[DebugSize++]=0x0a;
Data ++;
break;
default:
Data ++;
break;
}
}
else if ( *Data == '%')
{ //
switch ( *++Data )
{
case 's': //字符串
s = va_arg(ap, const char *);
for ( ; *s; s++)
{
DebugBuffer[DebugSize++] = *s;
}
Data++;
break;
case 'b':
d = va_arg(ap, int);
itoa(d, buf, 2);
for (s = buf; *s; s++)
{
DebugBuffer[DebugSize++]= *s;
}
Data++;
break;
case 'o':
d = va_arg(ap, int);
itoa(d, buf, 8);
for (s = buf; *s; s++)
{
DebugBuffer[DebugSize++]= *s;
}
Data++;
break;
case 'x':
d = va_arg(ap, int);
itoa(d, buf, 16);
for (s = buf; *s; s++)
{
DebugBuffer[DebugSize++]= *s;
}
Data++;
break;
case 'd': //十进制
d = va_arg(ap, int);
itoa(d, buf, 10);
for (s = buf; *s; s++)
{
DebugBuffer[DebugSize++]= *s;
}
Data++;
break;
default:
Data++;
break;
}
} /* end of else if */
else DebugBuffer[DebugSize++]= *Data++;
}
LOG_Send(DebugBuffer, DebugSize);
}
在应用层可以这么使用:
LOG(LOG_INFO,"PIR = %d at %d:%d:%d\r\n",keycount,Hour,Minite,Second); //上一篇:lyy
下一篇:HP DeskJet 1110 series 喷墨打印机USB描述符