📄 printf.c
字号:
/*
*********************************************************************************************************
* 文件: Printf.C.
* 描述: 串口输出函数.
* 编写: 深思 (001-12345@sohu.com).
*********************************************************************************************************
*/
#include "headers.h"
#include "uc_os.h"
#include <stdarg.h>
#include <stdio.h>
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.
********************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -