www.pudn.com > uCOS+GUI.rar > Printf.C


/* 
********************************************************************************************************* 
* 文件: Printf.C. 
* 描述: 串口输出函数. 
* 编写: 深思 (001-12345@sohu.com). 
********************************************************************************************************* 
*/ 
#include "headers.h" 
#include "uc_os.h" 
#include  
#include  
 
void Printf (const char *format, ...); 
void PrintS (char *Str); 
void PrintC (char Ch); 
void PrintI (INT32U Data); 
 
void Wr_Uart0_Buf (INT8U data); 
void StartSend (void); 
 
/* 
******************************************************************************************************** 
* 函数: void Printf (const char *format, ...). 
* 描述: 非规定参数输出函数, 与系统的 printf 相应. 
******************************************************************************************************** 
*/ 
void Printf (const char *format, ...) 
{ 
#define MAX_TBUF	100                             // 注意: 只允许接收改大小的字符串. 
 char    tbuf[MAX_TBUF] = {0, }; 
 va_list v_list; 
 char    *ptr; 
 INT8U   err; 
 
    OSSemPend (Uart0.Sem, 0, &err); 
 
	va_start(v_list, format);                       // Initialize variable arguments.  
	vsprintf(tbuf, format, v_list );  
	va_end(v_list); 
 
	ptr= tbuf; 
	while(*ptr !=  '\0') { 
		Wr_Uart0_Buf(*ptr++); 
	} 
 
    StartSend (); 
 
    OSSemPost (Uart0.Sem); 
 
#undef MAX_TBUF 
} 
 
/* 
******************************************************************************************************** 
* 函数: void PrintS (char *Str). 
* 描述: 输出字符串. 
******************************************************************************************************** 
*/ 
void PrintS (char *Str) 
{ 
 INT8U   err; 
 
    OSSemPend (Uart0.Sem, 0, &err); 
 
    while (*Str != '\0') { 
        Wr_Uart0_Buf (*Str++); 
    } 
 
    Wr_Uart0_Buf ('\0'); 
    StartSend (); 
 
    OSSemPost (Uart0.Sem); 
} 
 
/* 
******************************************************************************************************** 
* 函数: void PrintC (char Ch). 
* 描述: 输出字符. 
******************************************************************************************************** 
*/ 
void PrintC (char Ch) 
{ 
 INT8U   err; 
 
    OSSemPend (Uart0.Sem, 0, &err); 
 
    Wr_Uart0_Buf (Ch); 
    StartSend (); 
 
    OSSemPost (Uart0.Sem); 
} 
 
/* 
******************************************************************************************************** 
* 函数: void PrintI (INT32U Data). 
* 描述: 输出 32 位整型数据. 
******************************************************************************************************** 
*/ 
void PrintI (INT32U Data) 
{ 
 INT8U   err; 
 
    OSSemPend (Uart0.Sem, 0, &err); 
 
    Wr_Uart0_Buf ((INT8U)(Data>>16)); 
    Wr_Uart0_Buf ((INT8U)Data); 
    StartSend (); 
 
    OSSemPost (Uart0.Sem); 
} 
 
/* 
******************************************************************************************************** 
* 函数: void StartSend (void). 
* 描述: 判断是否启动发送. 
******************************************************************************************************** 
*/ 
void StartSend (void) 
{ 
    if (UTRSTAT0 & (1<<2)) {                        // 启动发送. 
        if (Uart0.Rd != Uart0.Wr) { 
            UTXH0 = Uart0.Buffer[Uart0.Rd++]; 
            if (Uart0.Rd >= Uart0BufSize) 
                Uart0.Rd = 0x00; 
        } 
    } 
} 
 
/* 
******************************************************************************************************** 
* 函数: void Wr_Uart0_Buf (INT8U data). 
* 描述: 将数据写入发送缓冲区. 
******************************************************************************************************** 
*/ 
void Wr_Uart0_Buf (INT8U data) 
{ 
    Uart0.Buffer[Uart0.Wr++] = data; 
    if (Uart0.Wr >= Uart0BufSize) { 
        Uart0.Wr = 0x00; 
    } 
} 
 
/* 
******************************************************************************************************** 
* End. 
******************************************************************************************************** 
*/