📄 uart0.c
字号:
#include <C8051F120.h>
#include <stdlib.h>
#include <string.h>
#include <uart0.h>
#define MAXLEN 10
u8 trdata[MAXLEN]; //要接收/发送的字符所存放的缓冲区
u8 txCounts = 0; //已发送的字符个数
u8 lxCounts = 0; //剩余未发送的字节个数
u8 len = 0; //要发送的数据的长度
u8 rpointer = 0; //读指针位置,指向要读的位
u8 wpointer = 0; //写指针位置,指向要写的位
//将要发送的数据放到缓冲区中
void SendBuf(u8 *tx)
{
u8 m = 0;
u8 i;
len = strlen(tx);
while(m < len)
{
i = 0;
lxCounts = len - m;
while ((m < len)&&(i < MAXLEN))
{
trdata[i] = *(tx + m);
i++;
m++;
}
TI0 = 1;
}
}
//发送单个字符
void Send_Char(u8 txch)
{
SBUF0 = txch;
while (TI0 == 0); //等待发送完毕
TI0 = 0; //软件清零
}
//发送字符串,调用Send_Char() len字符串长度
void Send_String(u8 *str)
{
u8 temp;
txCounts = 0;
while ((txCounts < len)&&(txCounts < MAXLEN)&&(txCounts < lxCounts))
{
temp = *(str + txCounts);
Send_Char(temp);
txCounts++;
}
}
/*
//--------------------------------------------------------------------------------------
//监听串口是否收到数据,读写指针不相等的话,缓冲区里有数据
u8 Listen(void)
{
if (rpointer != wpointer) return 1;
}
//返回缓冲区中数据长度
u8 SizeOfBuf(void)
{
return (wpointer - rpointer);
}
*/
//实现从循环数组中读取数据
//实现原理:由rpointer追赶wpointer,两者相等后都进行求模
//参数:'size'指要读取的数据的个数,receive[]指读出的数据所存放的地方
/*u8 ReadBuf(u8 size, u8 receive[])
{
u8 i = 0;
while ((i < size)&&(rpointer < wpointer))
{
receive[i] = trdata[rpointer % MAXLEN];
rpointer++;
i++;
if (rpointer == wpointer)
{
rpointer = rpointer % MAXLEN;
wpointer = rpointer;
}
}
return i;
}*/
//将从串口中读到的数据写到缓冲区中
//实现原理:如果(wpointer - rpointer) < MAXLEN,就说明缓冲区中还有空间存放数据
//返回'1'则说明写入一个数据,返回'0'则说明没有空间,写数据失败
u8 WriteBuf(u8 rxch)
{
if ((wpointer - rpointer) < MAXLEN)
{
trdata[wpointer % MAXLEN] = rxch; //存入缓冲区
wpointer++;
return 1;
} else return 0;
}
void inter() interrupt 4
{
if (TI0)
{
TI0 = 0;
Send_String(trdata);
}
if (RI0)
{
u8 rxch;
RI0 = 0; //软件清零
rxch = SBUF0; //读缓冲
WriteBuf(rxch);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -