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

📄 uart-51.c

📁 51双串口通讯程序
💻 C
字号:
/*=========================================================
  *				开发环境:Keil uVision3					*
  *				软件名称:					*
  *				开发日期:2007/1/10						*
  *				开 发 者:LPC							*
=========================================================*/
/**********************************************************
*				通信部分技术说明
*	时钟频率:	11.0592MHz
*	波特率:	9600
*	串口模式:	模式3
**********************************************************/
/*加入头文件*/
#include<W77C32.h>											//W77E58头文件
#include<intrins.h>											//
#include<stdio.h>											//
#include<stdlib.h>											//
#include<TYPE.H>											//声明定义
#include<OUTTYPE.H>											//声明字库
#include<INCLUDES.H>										//声明所有子函数
//=======================================================//
/*******************串口0通信函数开始*********************/
//=======================================================//

/*=========================================================
函数名:Uart_Checksum()
功能:通信数据发送函数
入口参数:无
出口参数:校验和(2字节)
=========================================================*/
Uint Uart_Checksum(void)
{
	Uchar z,r;												//声明变量
	Uint Checksum=0;										//声明变量
	z=Com[5]+4;												//提取数据长度
	for(r=4;r<z;r++)
	{
		Checksum+=(Uint)Com[r];								//计算累加和
	}
	return Checksum;										//返回校验和
}

/*=========================================================
函数名:Uart0_DownSend()
功能:485通信发送函数
入口参数:无
出口参数:无
=========================================================*/
void Uart0_DownSend(void)
{
	Uchar i,l;												//声明变量
	Com485=1;												//启动发送
	l=Com[5];												//提取数据长度
	for(i=0;i<l+6;i++)
	{
	    TB8=1;
		TI=0;												//清除发送空标志
		SBUF=Com[i];										//将Com0所指数据送发送缓冲
		while(!TI);											//查看是否发送完毕
	}
	Com485=0;												//启动接收
}

/*=========================================================
函数名:Uart0_DownReceiveCom()
功能:下行通信接收函数
入口参数:无
出口参数:接收状态信息(1字节)
=========================================================*/
Uchar Uart0_DownReceiveCom(void)
{
	Uchar i,l;												//声明变量
	Uint p,sum;												//声明变量
	Ulong s;												//声明变量
	Com485=0;												//485接收使能
	for(i=0;i<16;i++)
	{
		Com[i]=0;
	}
	s=0;													//初始化变量
	while(1)												//等待接收
	{
		if(RI)						   				        //等待接收响应
		{
			Com[0]=SBUF;									//移出接收数据
			RI=0;											//清除接收标志位
			if(Com[0]=='H')									//判断头字节'H'
			{
				break;
			}
		}
		s++;												//变量+1
		if(s>0x0000A000)									//如果超时2s
		{
			return UART_ERR_NOPRECEIVE;						//跳转
		}
	}
	for(i=1;i<0x06;i++)										//先接收头字节以及类型和长度
	{
		p=0;												//初始化变量
		while(!RI)											//等待接收响应
		{
			p++;											//防止接收死循环
			if(p>1000)										//防止死循环条件
			{
				break;										//放弃该字节接收
			}
		}
		Com[i]=SBUF;										//移出接收数据
		RI=0;												//清除接收标志位
	}
	if(Com[1]!='E')											//判断头字节'E'
	{
		return UART_ERR_HEAD2RECEIVE;						//返回头字节2接收错误
	}
	if(Com[2]!='A')											//判断头字节'A'
	{
		return UART_ERR_HEAD3RECEIVE;						//返回头字节3接收错误
	}
	if(Com[3]!='D')											//判断头字节'D'
	{
		return UART_ERR_HEAD4RECEIVE;						//返回头字节4接收错误
	}
	if(Com[5]>80)											//判断接收长度是否超出设计
	{
		return UART_ERR_LENGTHRECEIVE;						//否则返回无效长度
	}
	l=Com[5]+6;												//计算数据实际长度
	for(i=6;i<l;i++)										//接收剩余字节
	{
		p=0;												//初始化变量
		while(!RI)											//等待接收响应
		{
			p++;											//防止接收死循环
			if(p>1000)										//防止死循环条件
			{
				break;										//否则放弃该字节接收
			}
		}
		Com[i]=SBUF;										//提取数据
		RI=0;												//清除接收标志
	}
	sum=(((Uint)Com[l-1])<<8)+(Uint)Com[l-2];				//读取接收校验和字节
	p=Uart_Checksum();										//计算实际接收数据校验和
	if(sum!=p)												//判断校验和是否相等
	{
		return UART_ERR_CHECKSUMRECEIVE;					//不相等返回校验和错误
	}
	return UART_ERR_NORECEIVE;								//返回接收成功
}

//=======================================================//
/*******************串口0通信函数结束*********************/
//=======================================================//
//=======================================================//
/*******************串口1通信函数开始*********************/
//=======================================================//
/*=========================================================
函数名:Uart1_UpReceiveCom()
功能:上行通信接收函数
入口参数:无
出口参数:接收状态信息(1字节)
=========================================================*/
Uchar Uart1_UpReceiveCom(void)
{
	Uchar i,l;												//声明变量
	Uint p,sum;												//声明变量
	if(RI1)													//如果有接收响应
	{
	    
		Com[0]=SBUF1;										//移出接收数据
		RI1=0;												//清除接收标志位
		if(Com[0]!='H')										//判断头字节'H'
		{
			return UART_ERR_HEAD1RECEIVE;					//返回头字节1接收错误
		}
		for(i=1;i<0x06;i++)									//先接收头字节以及类型和长度
		{
			p=0;											//初始化变量
			while(!RI1)										//等待接收响应
			{
				p++;										//防止接收死循环
				if(p>1000)									//防止死循环条件
				{
					break;									//放弃该字节接收
				}
			}
			Com[i]=SBUF1;									//移出接收数据
			RI1=0;											//清除接收标志位
		}
		if(Com[1]!='E')										//判断头字节'E'
		{
			return UART_ERR_HEAD2RECEIVE;					//返回头字节2接收错误
		}
		if(Com[2]!='A')										//判断头字节'A'
		{
			return UART_ERR_HEAD3RECEIVE;					//返回头字节3接收错误
		}
		if(Com[3]!='D')										//判断头字节'D'
		{
			return UART_ERR_HEAD4RECEIVE;					//返回头字节4接收错误
		}
		if(Com[5]>80)										//判断接收长度是否超出设计
		{
			return UART_ERR_LENGTHRECEIVE;					//否则返回无效长度
		}
		l=Com[5]+6;											//计算数据实际长度
		for(i=6;i<l;i++)									//接收剩余字节
		{
			p=0;											//初始化变量
			while(!RI1)										//等待接收响应
			{
				p++;										//防止接收死循环
				if(p>1000)									//防止死循环条件
				{
					break;									//否则放弃该字节接收
				}
			}
			Com[i]=SBUF1;									//提取数据
			RI1=0;											//清除接收标志
		}
		sum=(((Uint)Com[l-1])<<8)+(Uint)Com[l-2];			//读取接收校验和字节
		p=Uart_Checksum();									//计算实际接收数据校验和
		if(sum!=p)											//判断校验和是否相等
		{
			return UART_ERR_CHECKSUMRECEIVE;				//不相等返回校验和错误
		}
		return UART_ERR_NORECEIVE;							//返回接收成功
	}
	return UART_ERR_NOPRECEIVE;								//返回没有接收响应
}

/*=========================================================
函数名:Uart1_UpSend()
功能:232通信发送函数
入口参数:无
出口参数:无
=========================================================*/
void Uart1_UpSend(void)
{
	Uchar i,l;												//声明变量
	l=Com[5];												//提取数据长度
	for(i=0;i<l+6;i++)
	{
		TB81=1;
		TI1=0;												//清除发送空标志
		SBUF1=Com[i];										//将Com0所指数据送发送缓冲
		while(!TI1);										//查看是否发送完毕
	}
}

//=======================================================//
/*******************串口1通信函数结束*********************/
//=======================================================//

⌨️ 快捷键说明

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