/***************************************************
*作 者:温子祺
*联系方式:wenziqi@hotmail.com
*说 明 :普通串口函数模板
*开发环境:RealView MDK
*处理器 :LPC2103
***************************************************/
在串口打印过程中,都是以字符串输出为主,但是在某些时候,我们需要打印变量的值,并以10进制或16进制输出。为了使用上更加方便,本人制作出口打印函数模板,大家使用该模板,只需要对UARTInit与UARTSendByte进行修改就可以了。
串口打印模板:
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
*文件名称: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这两个函数时,本人都喜欢这样用宏进行字符替换,由于宏的加入,代码显得更加灵活,即当前工程为调试模式时,打印信息正常输出,反之打印信息屏蔽。
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#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进行字符替换,直接编写为
编译器就会出现烦人的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
转载请注明出处,谢谢!