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. ******************************************************************************************************** */