📄 uart.c
字号:
/*****************************************************************************\
* *
* UART驱动模块 *
* *
\*****************************************************************************/
#include <stdarg.h>
#include <stdio.h>
#include "UART.h"
///////////////////////////////////////////////////////////////////////////////
//
// 功能:
// 初始化UART,必须在调用其他函数之前调用
// 参数:
// mclk 主时钟频率
// bps 需要的波特率
// 返回值:
// 无
//
void InitUART(unsigned mclk, unsigned bps)
{
rPCONE = rPCONE & ~0x3c | 0x28; // 设置PE1和PE2分别为TxD0和RxD0模式
rULCON0 = 3; // 正常模式,无奇偶位,1位停止位,8位数据位
rUCON0 = 5; // 中断或轮询模式
rUFCON0 = 0; // 禁止FIFO
rUMCON0 = 0;
rUBRDIV0 = CALC_UBRDIV(mclk, bps); // 计算并设置波特率
}
///////////////////////////////////////////////////////////////////////////////
//
// 功能:
// 从UART接收一个字符,如果没有收到则阻塞
// 参数:
// 无
// 返回值:
// 读到的字符
//
unsigned char UART_Getch(void)
{
while(!UART_Query()); // 等待有数据接收
return RdURXH0(); // 读取数据
}
void UART_Gets(char *buf, int max_len)
{
int c, len = 0, run = 1;
max_len--;
do {
c = UART_Getch();
switch(c)
{
case '\b':
if(len)
{
len--;
UART_Putch('\b');
UART_Putch(' ');
UART_Putch('\b');
}
break;
case '\r':
run = 0;
UART_Putch('\r');
UART_Putch('\n');
break;
default:
if(len < max_len)
{
buf[len++] = c;
UART_Putch(c);
}
else
UART_Putch('\a');
}
} while(run);
buf[len] = 0;
}
///////////////////////////////////////////////////////////////////////////////
//
// 功能:
// 向UART发送一个字符
// 参数:
// ch 待发送的字符
// 返回值:
// 无
//
void UART_Putch(unsigned char ch)
{
while(!(rUTRSTAT0 & 2)); // 等待发送数据寄存器为空
WrUTXH0(ch); // 发送数据
}
///////////////////////////////////////////////////////////////////////////////
//
// 功能:
// 向UART发送一个字符串
// 参数:
// str 待发送的字符串
// 返回值:
// 无
//
void UART_Puts(const char *str)
{
while(*str) // 遇到字符串结尾了吗?
{
UART_Putch(*str); // 没有,发送该字符
str++; // 跳到下一个字符
}
}
///////////////////////////////////////////////////////////////////////////////
//
// 功能:
// 向UART发送一个格式字符串(用法同printf)
// 参数:
// format 待发送的格式字符串
// ... 替换内容
// 返回值:
// 无
//
void UART_Printf(const char *format, ...)
{
char buf[256]; // 发送缓冲区
va_list args;
va_start(args, format);
vsprintf(buf, format, args); // 格式化字符串
va_end(args);
UART_Puts(buf); // 发送
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -