📄 uart-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 + -