/***********************************************************
*************************************************************/
#include "systerm.h"
uchar GsmRcv[MAXRCV] = {0};
uchar DebugBuf_U2[MAXBUF] = {0};
uchar DebugBuf_U1[MAXBUF] = {0};
uchar GsmRcvCnt = 0;
uchar GsmAtFlag = 0;
uchar Debug2RcvCnt = 0;
uchar Debug1RcvCnt = 0;
/***************************串口2初始化函數(shù)函數(shù)*****************************/
/*函數(shù)原型:char Uart2Init(char smod,char brtx12,unsigned char reload)
/*函數(shù)功能:初始化用于連接gprs的串口2 ,串口2只能設(shè)置為獨(dú)立波特率提供波特率
并打開(kāi)串口2中斷和全局中斷
/*輸入?yún)?shù): smod s2smod位 0/1
brtx12 brtx12位 0/1
reload reload寄存器數(shù)值 0-255
/*輸出參數(shù): -1 s2smod位錯(cuò)誤,沒(méi)有寫入0/1
-2 brtx12位錯(cuò)誤,沒(méi)有寫入0/1
0
/********************************************************************/
char Uart2Init(char s2smod,char brtx12,unsigned char reload)
{
S2CON = 0X50;//8位可變波特率,無(wú)奇偶位
BRT = reload;//設(shè)置獨(dú)立波特率發(fā)生器波特率
if(s2smod == 1)
{
AUXR |= S2SMOD; //S2SMOD = 1;//波特率倍速位
}
else if(s2smod == 0)
{
AUXR &= (~S2SMOD); //S2SMOD = 0;//取消波特率倍速位
}
else
{
return -1;
}
if(brtx12 == 1)
{
AUXR |= BRTx12;//BRTx12 = 1;1T模式
}
else if(brtx12 == 0)
{
AUXR &= (~BRTx12);//BRTx12 = 0;12T模式
}
else
{
return -2;
}
AUXR |= BRTR;//開(kāi)啟波特率發(fā)生器
//設(shè)置串口2中斷優(yōu)先級(jí)
IP2H |= PS2H; //設(shè)置串口2優(yōu)先級(jí)為3(最高)
IP2 |= PS2;
if (UART2_PRIO & 0x02)
{
IP2H |= PS2H;
}
else
{
IP2H &= ~PS2H;
}
if (UART2_PRIO & 0x01)
{
IP2 |= PS2;
}
else
{
IP2 &= ~PS2;
}
IE2 |= ES2;// ES2 = 1; //允許串口2中斷
EA = 1; //開(kāi)總中斷
return 0;
}
/***************************串口2發(fā)送函數(shù)函數(shù)************************/
/*函數(shù)原型:void Serial_Init(void)
/*函數(shù)功能:串口2發(fā)送函數(shù),發(fā)送單一數(shù)據(jù)
/*輸入?yún)?shù):數(shù)據(jù)
/*輸出參數(shù):無(wú)
/********************************************************************/
void Uart2SendHex(uchar i)
{
S2BUF = i;//裝入數(shù)據(jù)
while((S2CON & S2TI) == 0);
S2CON &= (~S2TI);//S2TI = 0;
}
/***************************串口2發(fā)送字符串函數(shù)**********************/
/*函數(shù)原型:void Uart2SendStr(char* data_at)
/*函數(shù)功能:串口2發(fā)送函數(shù),發(fā)送字符串
/*輸入?yún)?shù):字符串指針
/*輸出參數(shù):無(wú)
/********************************************************************/
void Uart2SendStr(char* data_at)
{
unsigned char cnt=0;
ET0=0;//關(guān)閉定時(shí)器0
while(*(data_at+cnt)) //判斷一串?dāng)?shù)據(jù)是否結(jié)束
{
S2BUF = *(data_at+cnt);//裝入數(shù)據(jù)
while((S2CON & S2TI) == 0);
S2CON &= (~S2TI);//S2TI = 0;
cnt++;
}
ET0=1;//打開(kāi)定時(shí)器0
}
/***************************串口1初始化函數(shù)**********************/
/*函數(shù)原型:char Uart1Init(char smod,char brtx12,unsigned char reload)
/*函數(shù)功能:串口1初始化
/*輸入?yún)?shù): smod smod位 0/1
brtx12 brtx12位 0/1
reload reload寄存器數(shù)值 0-255
/*輸出參數(shù): -1 smod位錯(cuò)誤,沒(méi)有寫入0/1
-2 brtx12位錯(cuò)誤,沒(méi)有寫入0/1
0
/*備注:串口設(shè)置位獨(dú)立波特率提供波特率,和串口2使用同一個(gè)波特率,也可以使用定時(shí)器1來(lái)提供波特率
/********************************************************************/
char Uart1Init(char smod,char brtx12,unsigned char reload)
{
SCON = 0X50;//8位可變波特率,無(wú)奇偶位(SM0=0,SM1=1),使能串口接收模塊(REN=1)
BRT = reload;//設(shè)置獨(dú)立波特率發(fā)生器波特率
if(smod == 1)
{
PCON |= SMOD; //SMOD = 1;//波特率倍速位
}
else if(smod == 0)
{
PCON &= (~SMOD); //SMOD = 0;//取消波特率倍速位
}
else
{
return -1;
}
if(brtx12 == 1)
{
AUXR |= BRTx12;//BRTx12 = 1;1T模式
}
else if(brtx12 == 0)
{
AUXR &= (~BRTx12);//BRTx12 = 0;12T模式
}
else
{
return -2;
}
AUXR |= S1BRS;//串口1設(shè)置為使用獨(dú)立波特率發(fā)生器
AUXR |= BRTR;//開(kāi)啟波特率發(fā)生器
//設(shè)置串口1中斷優(yōu)先級(jí)
if (UART1_PRIO & 0x02)
{
IPH |= PSH;
}
else
{
IPH &= ~PSH;
}
if (UART1_PRIO & 0x01)
{
PS = 1;
}
else
{
PS = 0;
}
ES = 1; //開(kāi)串口中斷
EA = 1; //開(kāi)總中斷
return 0;
}
/***************************串口1發(fā)送函數(shù)**********************/
/*函數(shù)原型:void Uart1SendHex(char i)
/*函數(shù)功能:串口1發(fā)送函數(shù)
/*函數(shù)功能:串口1發(fā)送函數(shù),發(fā)送單一數(shù)據(jù)
/*輸入?yún)?shù):數(shù)據(jù)
/*輸出參數(shù):無(wú)
/**************************************************************/
void Uart1SendHex(char i)
{
TI = 0; //清空發(fā)送完中斷請(qǐng)求標(biāo)志位
SBUF = i; //將數(shù)據(jù)放入寄存器發(fā)送
while(TI == 0);//等待發(fā)送完畢,發(fā)送完畢 TI == 1
TI = 0; //清空發(fā)送完中斷請(qǐng)求標(biāo)志位
}
/***************************串口1發(fā)送字符串函數(shù)**********************/
/*函數(shù)原型:void Uart1SendStr(char* data_at)
/*函數(shù)功能:串口1發(fā)送函數(shù),發(fā)送字符串
/*輸入?yún)?shù):字符串指針
/*輸出參數(shù):無(wú)
/********************************************************************/
void Uart1SendStr(char* at)
{
unsigned char cnt=0;
ET0=0;//關(guān)閉定時(shí)器0
while(*(at+cnt)) //判斷一串?dāng)?shù)據(jù)是否結(jié)束
{
SBUF=*(at+cnt); //發(fā)送數(shù)據(jù)
while(TI==0); //查詢發(fā)送是否結(jié)束
TI=0; //清除發(fā)送一標(biāo)志位
cnt++; //準(zhǔn)備發(fā)送一個(gè)數(shù)據(jù)
}
ET0=1;//打開(kāi)定時(shí)器0
}
/***************************串口1發(fā)送接收中斷函數(shù)********************/
/*函數(shù)原型:void Uart1InterruptReceive(void) interrupt 4
/*函數(shù)功能:串口2發(fā)送接收中斷函數(shù)
/*輸入?yún)?shù):無(wú)
/*輸出參數(shù):無(wú)
/*備注:接收函數(shù)內(nèi)部不可以放入其他的中斷或者發(fā)送函數(shù),否則影響接收數(shù)據(jù)
/********************************************************************/
void Uart1InterruptReceive(void) interrupt 4
{
char tmp = 0;
if(RI)
{
ES=0;//關(guān)串行口中斷
RI=0;//接收中斷信號(hào)清零,表示將繼續(xù)接收
tmp = SBUF;//接收數(shù)據(jù)
#ifdef UART1_DEBUG
//將接收到的數(shù)據(jù)放入DebugBuf_U1,在定時(shí)器內(nèi),DebugBuf_U1會(huì)被串口2發(fā)送給GSM模塊。
//這樣通過(guò)串口1發(fā)送到單片機(jī)的數(shù)據(jù)GSM模塊就可以收到了,主要為了調(diào)試的方便。
DebugBuf_U1[Debug1RcvCnt] = tmp;
Debug1RcvCnt++;
if(Debug1RcvCnt>=MAXBUF-1)
{
Debug1RcvCnt = 0;
}
#endif
ES=1;//開(kāi)串行口中斷
}
}
/***************************串口2發(fā)送接收中斷函數(shù)**********************/
/*函數(shù)原型:void Uart2InterruptReceive(void) interrupt 8
/*函數(shù)功能:串口2發(fā)送接收中斷函數(shù)
/*輸入?yún)?shù):無(wú)
/*輸出參數(shù):無(wú)
/*備注:接收函數(shù)內(nèi)部不可以放入其他的中斷或者發(fā)送函數(shù),否則影響接收數(shù)據(jù)
用于接收GPRS模塊傳輸來(lái)的數(shù)據(jù),將數(shù)據(jù)保存到GsmRcv[],在函數(shù)中使用strstr判斷數(shù)據(jù)。
/********************************************************************/
void Uart2InterruptReceive(void) interrupt 8
{
unsigned char tmp = 0;
uchar i = 0;
IE2 &= (~ES2);//關(guān)閉串口2中斷//ES2 = 0;
if(S2CON & S2RI) //if(S2RI == 1)
{
S2CON &= (~S2RI);//S2RI = 0;
tmp = S2BUF;
#ifdef UART1_DEBUG
//將接收到的數(shù)據(jù)放入DebugBuf_U2,在定時(shí)器內(nèi),DebugBuf_U2會(huì)被串口1發(fā)送給PC機(jī)。
//這樣GSM發(fā)送給單片機(jī)的數(shù)據(jù)也可以在電腦上觀察到了。
DebugBuf_U2[Debug2RcvCnt] = tmp;
Debug2RcvCnt++;
if(Debug2RcvCnt>=MAXBUF-1)
{
Debug2RcvCnt = 0;
}
#endif
GsmRcv[GsmRcvCnt] = tmp;
GsmRcvCnt++;
if(GsmRcvCnt > MAXRCV)
{
GsmRcvCnt = 0;
}
}
IE2 |= ES2;//ES2 = 1;
}
/***************************GPRS接收緩沖數(shù)據(jù)初始化函數(shù)***************/
/*函數(shù)原型:void CleanGsmRcv(void)
/*函數(shù)功能:將GsmRcv[]數(shù)據(jù)清除,并且使緩沖指針移到第一位。
/*輸入?yún)?shù):無(wú)
/*輸出參數(shù):無(wú)
/********************************************************************/
void CleanGsmRcv(void)
{
uchar i = 0;
for(i=0; i<=MAXRCV; i++)
{
GsmRcv[i] = 0;
}
GsmRcvCnt = 0;
}
/***************************GPRS緩沖數(shù)據(jù)握手函數(shù)***************/
/*函數(shù)原型:bit Hand(unsigned char *a)
/*函數(shù)功能:判斷收到的數(shù)據(jù)是否出現(xiàn)判斷的數(shù)據(jù)。
/*輸入?yún)?shù):判斷出現(xiàn)的數(shù)據(jù)
/*輸出參數(shù): 1:出現(xiàn)了判斷的數(shù)據(jù)
0:沒(méi)有出現(xiàn)判斷的數(shù)據(jù)
/********************************************************************/
bit Hand(unsigned char *a)
{
if(strstr(GsmRcv,a)!=NULL)
return 1;
else
return 0;
}
|