如果在使用IAR虚拟终端时重载了输入输出函数,则不会从IAR虚拟终端输出,每次修改很麻烦,我们可以写一个源文件通过条件编译来实现我们想要的输出方式。
定义两个宏来控制我们要要的方式:
/*启用调试使用功能代码*/
#ifndef DEBUG_CODE_ENABLE
#define DEBUG_CODE_ENABLE (1)
#endif
在调试时,将DEBUG_CODE_ENABLE设为1,方便查看,在项目正式发布时则可将DEBUG_CODE_ENABLE设为0将这段代码屏蔽。
/*定义开关串口打印的宏,当为1时使用串口输出,当为0时使用IAR虚拟终端*/
#ifndef USART_PRINT_ENABLE
#define USART_PRINT_ENABLE (0)
#endif
而在使用时,如果输出的内容数量和种类比较多的话,实现起来比较乱而且可能破环其他部分代码的整体性和可读性。我们可以使用函数指针来集中操作,这样无论是代码还是输出信息的完整性都可以保证,而且实现条件编译也变得更简洁。
先定义一个打印对象类型的枚举类型和一个打印对象的结构体,如下:
/*定义一个打印对象数据类型的枚举,有新类型是在此添加即可*/
typedef enum{
pChar,
pInt8,
pInt16,
pInt32,
pFloat,
pString
}PrintType;
/*定义一个答应对象的结构体类型*/
typedef struct{
PrintTypeprintType;
void *objValue;
}PrintObject;
再定义一个函数指针数组用于存放打印函数的指针:
int (*ObjPrintf[])(void*objValue)={CharPrintf,Int8Printf,Int16Printf,Int32Printf,FloatPrintf,StringPrintf};
并定义一个调用打印的函数:
/*调试时批量打印输出函数*/
void DebugOutput(PrintObject *printObject,uint16_t amount);
对于具体的实现函数根据自己的要求实现就可以了。
在调用时只需要定义一个要输出的对象数组并将其作为参数传递给DebugOutput汗数据可以了。
/*启用调试辅助代码时,初始化显影的参数*/
#if DEBUG_CODE_ENABLE > (0)
chartitle[]="nThe result is:";
PrintObjectprintObject[]={{pString,title},{pFloat,&o2Concentration},{pFloat,&h2Concentration},{pFloat,&ch4Concentration}};
/*如果启用了串口打印输出功能,则初始化串口配置*/
#if USART_PRINT_ENABLE > (0)
PrintUsartConfiguration();
#endif
#endif
/*用于测试*/
#if DEBUG_CODE_ENABLE > (0)
DebugOutput(printObject,sizeof(printObject)/sizeof(PrintObject));
#endif
如此就可以非常方便的输出信息、并可根据自己的需要控制是否输出调试信息,采用何种信息输出方式了,对调试来说非常有帮助。