/***************************************************
*作 者:温子祺
*联系方式: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
#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.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( " " );
}
---------------------------------------------------------------
文件名称: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( " " );
}
转载请注明出处,谢谢!