⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.h

📁 基于51类单片机RTX51多任务系统
💻 H
字号:
#ifndef	__UART_H__
#define	__UART_H__

#include <regx52.h>

#define max 20//定义缓冲区大小

void inibuffer(void);
void comini(void);
char sent(char *,char);
void sentoff(void);
char getchar(void);
char getstring(char *,char);

struct comset
	{
		char tcombuffer[max];//发送缓冲区:环状
		char rcombuffer[max];//接收缓冲区
		char rcount,tcount;//收发的有效数据数
		char rstart,rend,tstart,tend;//当前读写起始与结束位置
		char issent;//正在发送过程中 1:发送,0未发送
	};
idata struct comset a;

void inibuffer(void)//初始化缓冲区,所有数据置0或初值
{
	char i;
 	for(i=0;i<max;i++)
  	{
		a.rcombuffer[i]=0;a.tcombuffer[i]=0;
	}
 	a.tcount=0;
	a.rcount=0;
	a.rstart=0;
	a.rend=0;
	a.tstart=0;
	a.tend=0;
	a.issent=0;
}

void comini(void)
{
	TMOD=TMOD|0x20; 	// 定时器T1:1个8位自动重装定时器
	TH1=0xF3; //定时器1波特率为9600
	TL1=0xF3;//T1为波特率发生器
	SCON=0x50;//串行口模式1
	PCON=0X80;
	ET1=0;
	ES=1; 
	TR1=1;
	EA=1;
}

char sent(char *b,char n)//发送的字节数=发送(字符串指针,字符个数)
{
 	unsigned char i;
 	if(n>max-a.tcount)//缓冲区字节不够拒绝发送返回0
 	{return 0;}
 	for(i=0;i<n;i++)
 	{
  		a.tcombuffer[a.tend]=b[i];//向缓冲区尾部拷贝字符
  		a.tend++;//尾部指针++
  		a.tcount++;//缓冲区总字节数++
  		if(a.tend>=max)//循环利用缓冲区
   			a.tend=0;
  		if(a.tcount>max)//达到最大值就退出(单线程程序不会达到最大值)
   			break;
	}
 	if(a.issent==0)//如果不在发送状态就开始发送
 	{
 		SBUF=a.tcombuffer[a.tstart];//发送第一个字节
 		a.tstart++;//其实字节后移
   		if( a.tstart>=max)a.tstart=0;
 		a.issent=1;//发送标志置一
 		a.tcount--;//总字节--
 	}
 	return i;//返回复制到缓冲区的字节数
}

void sentoff(void)//等待发送完成,也可以发送开始就执行代码以提高效率,有些交互式需要等待发送完成才能读取输入。
{
 	while(a.issent==1);//等待发送停止
} 

char getchar(void)//从缓冲区读取一个字节
{
 	char e;
 	if(a.rcount>0)
 	{
 		e=a.rcombuffer[a.rstart];//从开头读,要求所有输入字节都有对应的函数处理
 		a.rstart++;
		if (a.rstart>=max) a.rstart=0;
 		a.rcount--;
		return e; 
 	}
 	return 0;
}

char getstring(char *c,char oeb)//返回值是读的字节数,oeb:允许输出最大字节数,c是读取字节存放的位置
{
	char k,l=0;
 	sentoff();//等待发送完毕,这样才有有效输入
 	while(a.rstart!=(a.rend+1)%max)//缓冲区不满
 	{
 		for(k=a.rstart;k!=a.rend;k++,k=k%max)//判断输入完的回车是否读入
 		{
  			if(a.rcombuffer[k]=='\r')
  				{
   					while(a.rcombuffer[a.rstart]!='\r')//有则拷贝
   					{
    					c[l]=a.rcombuffer[a.rstart];
    					a.rstart++;
    					a.rcount--;
    					l++;
    					if(l==oeb)//超过允许最大值就返回
    					return l;
					}
   					//a[l]=a.rcombuffer[a.rstart];//不复制回车符
					a.rstart++;//删除回车
   					a.rcount--;
   					return l;
  				}
 		}
 	}

 	//缓冲区满
 	while(sent("\nerror:full\n",12)!=12);//会留在缓冲区未读字节,所以输出错误提示
 	for(k=a.rstart;k<oeb;k++,k=(k)%(max+1))//返回最大有效的 字符数注意:OEB《max
 	{
 		c[l++]=a.rcombuffer[k];
	}
 	sentoff();//等到提示发送完毕
	inibuffer();//初始化缓冲区,删除垃圾,由于发送较慢,有可能还有垃圾存在
	return l;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -