串口函数模板(普通+高级串口函数模板)

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

 *开发环境:RealView MDK 

 *处理器  :LPC2103

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

 

普通串口函数模板地址:http://www.cnblogs.com/wenziqi/archive/2010/07/14/1777199.html

高级串口函数模板地址:http://www.cnblogs.com/wenziqi/archive/2010/07/14/1777259.html

 

首先为什么要整合这两个模板呢?

(1)普通串口函数模板虽然占用空间小,但是只能打印普通字符串、10/16进制值。

(2)高级串口函数模板虽然占用空间大,但是打印功能异常强大。

 

所以,为了方便在各种不同类型的单片机上使用,即资源充足的使用高级串口函数模板,资源贫乏的使用普通串口函数模板。

 

整合后的代码模板如下:

 

UARTDef.h

 

代码
#define EN_DEBUG (0)
#define EN_SYS_STR_LIB (1)
#if EN_DEBUG

#if EN_SYS_STR_LIB
#define DbgPrintf UARTPrintf
#else
#define DbgPrintf UARTPrintfString
#endif

#define DEBUGMSG DbgPrintf
#define DEBUGMSGEx UARTPrintfVal

#else

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

#endif

 

 

 

UART.h

 

代码
/*
---------------------------------------------------------------
文件名称:UART.h
说 明:提供串口打印信息
作 者:温子祺
创建时间:2010-06-10
---------------------------------------------------------------
*/
#ifndef __UART_H__
#define __UART_H__



#if EN_SYS_STR_LIB
#include
<stdarg.h>

extern void UARTPrintf(CHAR *fmt, ...);

extern int vsprintf(char *string, char *format, va_list param);

#endif

extern void UARTInit(UINT32 unFpclk,UINT32 unBaud);
extern void UARTSendByte(UINT8 ucByte);
extern void UARTSendNBytes(UINT8 *pucBytes,UINT32 unSendLength);
extern void UARTPrintfString(CHAR *pcStr);
extern void UARTPrintfVal (CHAR *pstr,
UINT32 val,
UINT32 DecOrHex);
extern UINT8 UARTGetByte(void);

#define EN_UART_DEBUG (1)

#if EN_UART_DEBUG
#define UARTMSG DEBUGMSG
#define UARTMSGEx DEBUGMSGEx
#else
#define UARTMSG(x) ((void)0)
#define UARTMSGEx(x,y,z) ((void)0)
#endif





#endif


 

UART.c

 

代码
/*
---------------------------------------------------------------
文件名称:UART.c
说 明:提供串口打印信息
作 者:温子祺
创建时间:2010-06-10
---------------------------------------------------------------
*/
#include
"LPC2294.h"
#include
"Global.h"
#include
"UART.h"

/******************************************************
*文件名称: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);
}
/******************************************************
*文件名称:UARTSendNBytes
*输 入:pucBytes 数据缓冲区
unSendLength 发送数据长度
*输 出:无
*功能说明:串口 发送多个字节
******************************************************
*/
void UARTSendNBytes(UINT8 *pucBytes,UINT32 unSendLength)
{
while(unSendLength--)
{
UARTSendByte(
*pucBytes++);
}
}
/******************************************************
*文件名称:UARTPrintf
*输 入:pcStr 字符串
*输 出:无
*功能说明:串口 打印字符串
******************************************************
*/
void UARTPrintfString(CHAR *pcStr)
{
while(pcStr && *pcStr)
{
UARTSendByte(
*pcStr++);
}
}
/******************************************************
*文件名称:UARTPrintf
*输 入:pcStr
*输 出:无
*功能说明:串口 打印字符串
******************************************************
*/
#if EN_SYS_STR_LIB
void UARTPrintf(CHAR *fmt, ...)
{
va_list ap;
CHAR
string[256];

va_start(ap,fmt);
vsprintf(
string,fmt,ap);
UARTPrintfString(
string);
va_end(ap);
}

#endif
/******************************************************
*文件名称:UARTGetByte
*输 入:无
*输 出:单个字节
*功能说明:串口 获取字节
******************************************************
*/
UINT8 UARTGetByte(
void)
{
UINT8 ucRecvByte;

while((U0LSR & 0x01) == 0);

ucRecvByte
=U0RBR;

return ucRecvByte;
}
/*************************************************************
* 函数名称: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(
" ");
}


 

 

 

转载请注明出处,谢谢! 

 

posted @ 2010-07-14 15:48  温子祺  阅读(1097)  评论(0编辑  收藏  举报