普通串口打印函数模板

/***************************************************
 *作     者:温子祺
 *联系方式:wenziqi@hotmail.com
 *说   明 :普通串口函数模板

 *开发环境:RealView MDK 

 *处理器  :LPC2103

 ***************************************************/

 

    在串口打印过程中,都是以字符串输出为主,但是在某些时候,我们需要打印变量的值,并以10进制或16进制输出。为了使用上更加方便,本人制作出口打印函数模板,大家使用该模板,只需要对UARTInit与UARTSendByte进行修改就可以了。

   

串口打印模板:

 

代码
/******************************************************
*文件名称:UARTInit
*输 入:unFpclk 外设时钟频率
unBaud 波特率
*输 出:无
*功能说明:串口初始化
******************************************************
*/
void UARTInit(UINT32 unFpclk,UINT32 unBaud)
{
UINT16 usFdiv;

PINSEL0
&=~0x0F;
PINSEL0
|= 0x05;

U0LCR
= 0x83;

usFdiv
= (unFpclk / 16) / unBaud;

U0DLM
= usFdiv / 256;
U0DLL
= usFdiv % 256;

U0LCR
= 0x03;
}
/******************************************************
*文件名称:UARTSendByte
*输 入:ucByte 字节
*输 出:无
*功能说明:串口 发送单个字节
******************************************************
*/
void UARTSendByte(UINT8 ucByte)
{
U0THR
= ucByte;
while ((U0LSR & 0x40) == 0);
}
/******************************************************
*文件名称:UARTPrintf
*输 入:pcStr 字符串
*输 出:无
*功能说明:串口 打印字符串
******************************************************
*/
void UARTPrintfString(CHAR *pcStr)
{
while(pcStr && *pcStr)
{
UARTSendByte(
*pcStr++);
}
}
/*************************************************************
* 函数名称:UARTPrintfVal
* 输 入:pstr 字符串
val 变量值
DecOrHex 10/16进制
* 输 出:无
* 说 明:从串口打印字符串,支持10/16进制数据打印
*************************************************************
*/
void UARTPrintfVal(CHAR *pstr,
UINT32 val,
UINT32 DecOrHex)
{
INT32 i
=0;
INT8 buf[
10]={0};

UARTPrintfString((
char *)pstr);

if(10 == DecOrHex)
{
for(i=0; i<10 ;i++)
{
buf[i]
=(UINT8)('0'+val%10);
val
/=10;
}

for(i=9;i>=0;)
{
if('0' == buf[i])
{
if(i)i--;
else break;
}
else
{
break;
}
}

while(1)
{

UARTSendByte(buf[i]);

if(!i)
{
break;
}

i
--;
}

}
else if(16 == DecOrHex)
{
UARTSendByte(
'0');
UARTSendByte(
'x');

i
=28;

while(i)
{
if(0 == ((val>>i) &0x0f))
{
i
=i-4;

}
else
{
break;
}
}

while(1)
{
UARTSendByte(g_cHexTbl[(val
>>i) &0x0f]);

if(!i)
{
break;
}

i
=i-4;
}

}

UARTPrintfString(
" ");
}

 

      在使用UARTPrintfString和UARTPrintfVal这两个函数时,本人都喜欢这样用宏进行字符替换,由于宏的加入,代码显得更加灵活,即当前工程为调试模式时,打印信息正常输出,反之打印信息屏蔽。

 

代码
#define EN_DEBUG (0)

#if EN_DEBUG

#define DEBUGMSG UARTPrintfString
#define DEBUGMSGEx UARTPrintfVal

#else
#define DEBUGMSG(x) (void)0
#define DEBUGMSGEx(x,y,z) (void)0

#endif

 

 

  

      从上面的代码可以知道,只要通过设置宏EN_DEBUG就能够很轻易控制打印信息的输出。当EN_DEBUG=1,打印信息正常输出;当EN_DEBUG=0,打印信息得到屏蔽。有一点要注意的是EN_DEBUG=0时,DEBUGMSG和DEBUGMSGEx的设置,它们必须以(void)0进行替换,当编译代码时,编译器会自动忽略(void)0的。一旦DEBUGMSG和DEBUGMSGEx不用(void)0进行字符替换,直接编写为

#define DEBUGMSG
#define DEBUGMSGEx

 

编译器就会出现烦人的waring。

 

 

 

  使用方法:  

(1)打印普通字符串

 

      DEBUGMSG("Hello Wenziqi");

      串口输出字符串:Hello Wenziqi

 

(2)打印10进制

 

       i=12;

 

       DEBUGMSGEx("i=",i,10);

 

       串口输出字符串:i=12

 

(3)打印16进制

 

      i=31;

 

      DEBUGMSGEx("i=",i,16);

 

       串口输出字符串:i=0x1F

 

 转载请注明出处,谢谢!

 

 

posted @ 2010-07-14 13:50  温子祺  阅读(2685)  评论(0编辑  收藏  举报