?? uart-51.c
字號(hào):
/*=========================================================
* 開發(fā)環(huán)境:Keil uVision3 *
* 軟件名稱: *
* 開發(fā)日期:2007/1/10 *
* 開 發(fā) 者:LPC *
=========================================================*/
/**********************************************************
* 通信部分技術(shù)說(shuō)明
* 時(shí)鐘頻率: 11.0592MHz
* 波特率: 9600
* 串口模式: 模式3
**********************************************************/
/*加入頭文件*/
#include<W77C32.h> //W77E58頭文件
#include<intrins.h> //
#include<stdio.h> //
#include<stdlib.h> //
#include<TYPE.H> //聲明定義
#include<OUTTYPE.H> //聲明字庫(kù)
#include<INCLUDES.H> //聲明所有子函數(shù)
//=======================================================//
/*******************串口0通信函數(shù)開始*********************/
//=======================================================//
/*=========================================================
函數(shù)名:Uart_Checksum()
功能:通信數(shù)據(jù)發(fā)送函數(shù)
入口參數(shù):無(wú)
出口參數(shù):校驗(yàn)和(2字節(jié))
=========================================================*/
Uint Uart_Checksum(void)
{
Uchar z,r; //聲明變量
Uint Checksum=0; //聲明變量
z=Com[5]+4; //提取數(shù)據(jù)長(zhǎng)度
for(r=4;r<z;r++)
{
Checksum+=(Uint)Com[r]; //計(jì)算累加和
}
return Checksum; //返回校驗(yàn)和
}
/*=========================================================
函數(shù)名:Uart0_DownSend()
功能:485通信發(fā)送函數(shù)
入口參數(shù):無(wú)
出口參數(shù):無(wú)
=========================================================*/
void Uart0_DownSend(void)
{
Uchar i,l; //聲明變量
Com485=1; //啟動(dòng)發(fā)送
l=Com[5]; //提取數(shù)據(jù)長(zhǎng)度
for(i=0;i<l+6;i++)
{
TB8=1;
TI=0; //清除發(fā)送空標(biāo)志
SBUF=Com[i]; //將Com0所指數(shù)據(jù)送發(fā)送緩沖
while(!TI); //查看是否發(fā)送完畢
}
Com485=0; //啟動(dòng)接收
}
/*=========================================================
函數(shù)名:Uart0_DownReceiveCom()
功能:下行通信接收函數(shù)
入口參數(shù):無(wú)
出口參數(shù):接收狀態(tài)信息(1字節(jié))
=========================================================*/
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) //等待接收響應(yīng)
{
Com[0]=SBUF; //移出接收數(shù)據(jù)
RI=0; //清除接收標(biāo)志位
if(Com[0]=='H') //判斷頭字節(jié)'H'
{
break;
}
}
s++; //變量+1
if(s>0x0000A000) //如果超時(shí)2s
{
return UART_ERR_NOPRECEIVE; //跳轉(zhuǎn)
}
}
for(i=1;i<0x06;i++) //先接收頭字節(jié)以及類型和長(zhǎng)度
{
p=0; //初始化變量
while(!RI) //等待接收響應(yīng)
{
p++; //防止接收死循環(huán)
if(p>1000) //防止死循環(huán)條件
{
break; //放棄該字節(jié)接收
}
}
Com[i]=SBUF; //移出接收數(shù)據(jù)
RI=0; //清除接收標(biāo)志位
}
if(Com[1]!='E') //判斷頭字節(jié)'E'
{
return UART_ERR_HEAD2RECEIVE; //返回頭字節(jié)2接收錯(cuò)誤
}
if(Com[2]!='A') //判斷頭字節(jié)'A'
{
return UART_ERR_HEAD3RECEIVE; //返回頭字節(jié)3接收錯(cuò)誤
}
if(Com[3]!='D') //判斷頭字節(jié)'D'
{
return UART_ERR_HEAD4RECEIVE; //返回頭字節(jié)4接收錯(cuò)誤
}
if(Com[5]>80) //判斷接收長(zhǎng)度是否超出設(shè)計(jì)
{
return UART_ERR_LENGTHRECEIVE; //否則返回?zé)o效長(zhǎng)度
}
l=Com[5]+6; //計(jì)算數(shù)據(jù)實(shí)際長(zhǎng)度
for(i=6;i<l;i++) //接收剩余字節(jié)
{
p=0; //初始化變量
while(!RI) //等待接收響應(yīng)
{
p++; //防止接收死循環(huán)
if(p>1000) //防止死循環(huán)條件
{
break; //否則放棄該字節(jié)接收
}
}
Com[i]=SBUF; //提取數(shù)據(jù)
RI=0; //清除接收標(biāo)志
}
sum=(((Uint)Com[l-1])<<8)+(Uint)Com[l-2]; //讀取接收校驗(yàn)和字節(jié)
p=Uart_Checksum(); //計(jì)算實(shí)際接收數(shù)據(jù)校驗(yàn)和
if(sum!=p) //判斷校驗(yàn)和是否相等
{
return UART_ERR_CHECKSUMRECEIVE; //不相等返回校驗(yàn)和錯(cuò)誤
}
return UART_ERR_NORECEIVE; //返回接收成功
}
//=======================================================//
/*******************串口0通信函數(shù)結(jié)束*********************/
//=======================================================//
//=======================================================//
/*******************串口1通信函數(shù)開始*********************/
//=======================================================//
/*=========================================================
函數(shù)名:Uart1_UpReceiveCom()
功能:上行通信接收函數(shù)
入口參數(shù):無(wú)
出口參數(shù):接收狀態(tài)信息(1字節(jié))
=========================================================*/
Uchar Uart1_UpReceiveCom(void)
{
Uchar i,l; //聲明變量
Uint p,sum; //聲明變量
if(RI1) //如果有接收響應(yīng)
{
Com[0]=SBUF1; //移出接收數(shù)據(jù)
RI1=0; //清除接收標(biāo)志位
if(Com[0]!='H') //判斷頭字節(jié)'H'
{
return UART_ERR_HEAD1RECEIVE; //返回頭字節(jié)1接收錯(cuò)誤
}
for(i=1;i<0x06;i++) //先接收頭字節(jié)以及類型和長(zhǎng)度
{
p=0; //初始化變量
while(!RI1) //等待接收響應(yīng)
{
p++; //防止接收死循環(huán)
if(p>1000) //防止死循環(huán)條件
{
break; //放棄該字節(jié)接收
}
}
Com[i]=SBUF1; //移出接收數(shù)據(jù)
RI1=0; //清除接收標(biāo)志位
}
if(Com[1]!='E') //判斷頭字節(jié)'E'
{
return UART_ERR_HEAD2RECEIVE; //返回頭字節(jié)2接收錯(cuò)誤
}
if(Com[2]!='A') //判斷頭字節(jié)'A'
{
return UART_ERR_HEAD3RECEIVE; //返回頭字節(jié)3接收錯(cuò)誤
}
if(Com[3]!='D') //判斷頭字節(jié)'D'
{
return UART_ERR_HEAD4RECEIVE; //返回頭字節(jié)4接收錯(cuò)誤
}
if(Com[5]>80) //判斷接收長(zhǎng)度是否超出設(shè)計(jì)
{
return UART_ERR_LENGTHRECEIVE; //否則返回?zé)o效長(zhǎng)度
}
l=Com[5]+6; //計(jì)算數(shù)據(jù)實(shí)際長(zhǎng)度
for(i=6;i<l;i++) //接收剩余字節(jié)
{
p=0; //初始化變量
while(!RI1) //等待接收響應(yīng)
{
p++; //防止接收死循環(huán)
if(p>1000) //防止死循環(huán)條件
{
break; //否則放棄該字節(jié)接收
}
}
Com[i]=SBUF1; //提取數(shù)據(jù)
RI1=0; //清除接收標(biāo)志
}
sum=(((Uint)Com[l-1])<<8)+(Uint)Com[l-2]; //讀取接收校驗(yàn)和字節(jié)
p=Uart_Checksum(); //計(jì)算實(shí)際接收數(shù)據(jù)校驗(yàn)和
if(sum!=p) //判斷校驗(yàn)和是否相等
{
return UART_ERR_CHECKSUMRECEIVE; //不相等返回校驗(yàn)和錯(cuò)誤
}
return UART_ERR_NORECEIVE; //返回接收成功
}
return UART_ERR_NOPRECEIVE; //返回沒有接收響應(yīng)
}
/*=========================================================
函數(shù)名:Uart1_UpSend()
功能:232通信發(fā)送函數(shù)
入口參數(shù):無(wú)
出口參數(shù):無(wú)
=========================================================*/
void Uart1_UpSend(void)
{
Uchar i,l; //聲明變量
l=Com[5]; //提取數(shù)據(jù)長(zhǎng)度
for(i=0;i<l+6;i++)
{
TB81=1;
TI1=0; //清除發(fā)送空標(biāo)志
SBUF1=Com[i]; //將Com0所指數(shù)據(jù)送發(fā)送緩沖
while(!TI1); //查看是否發(fā)送完畢
}
}
//=======================================================//
/*******************串口1通信函數(shù)結(jié)束*********************/
//=======================================================//
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -