?? uartnews._h
字號(hào):
void ReDial(void);
/**************************************************
*原型:void InitUART( unsigned char baudrate )
*功能:串口初始化,19.2k,一個(gè)字節(jié)520.8US
*參數(shù):unsigned char baudrat
*返回:無
**************************************************/
void InitUART( unsigned char baudrate )
{
UBRR = baudrate; //19.2k
UCSRB = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) );//接收中斷開,接收口開,發(fā)送口開
UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);//8位數(shù)據(jù)+1位STOP位
}
/*************************************************
*原型:void UART_TX_interrupt(void)
*功能:初始化,執(zhí)行任務(wù)
*說明:無
*參數(shù):無
*返回:無
**************************************************/
/* 字符輸出函數(shù) */
void putchar(unsigned char c)
{
while (!GET_BIT(UCSRA,UDRE)) ;
UDR=c;
}
/* 字符串輸出函數(shù) */
void puts(char *s)
{
while (*s)
{
putchar(*s);
s++;
}
putchar(0x0D);//回車換行
putchar(0x0A);
}
void putgmgr(char *s)
{
while (*s)
{
putchar(*s);
s++;
}
putchar(0x1a);//^z
}
/*************************************************
*原型:unsigned char Bj_rx(uchar addrss_1,uchar data,uchar count_1)
*功能:在數(shù)組內(nèi)查找一個(gè)字符
*說明:如果有找到返回地址,無返回0
*參數(shù):addrss,data
*返回:addrss or 0
**************************************************/
unsigned char Bj_rx(uchar addrss_1,uchar data,uchar count_1)
{
for( ;count_1<addrss_1;count_1++)
{
//判斷SIM卡有無預(yù)存號(hào)
if(Uart.Buf[count_1] == data)
return count_1;
}
return 0;
}
/*************************************************
*原型:void CopyStr(uchar *p,uchar *s)
*功能:把字符串s拷貝在p
*說明:無
*參數(shù):*p,*S
*返回:指針地址
*日期:06-01-16
**************************************************/
uchar *CopyStr(uchar *p,uchar *s)
{
do
{
*p ++ =*s++;
}
while((*s != NULL)&&(*s != 0x0d));
*p = NULL;
return p;
}
/*************************************************
*原型:uint ReadTime(uchar *p)
*功能: 讀取心跳時(shí)間與復(fù)位時(shí)間
*說明:如果無存心跳時(shí)間為10分鐘,復(fù)位時(shí)間為1天
*參數(shù):uchar *p-接收到,len長度
*返回:val-運(yùn)算完的值
**************************************************/
#define TIMELEN 4
uint ReadTime(uchar *p)
{
uchar count;
uint temp=1;
uint val = NULL;
uint tempval;
uchar bitcount=0;//位計(jì)數(shù)
//當(dāng)結(jié)束或超過位數(shù)跳出
while((*p != '"')&&(bitcount < TIMELEN))
{
count = *p ++; //把值讀進(jìn)
count = count - 0x30;
tempval =(uint)(val * 10); //乘進(jìn)位
val = (uint)(count+tempval); //存進(jìn)
bitcount ++; //位數(shù)加1
}
return val;
}
/*************************************************
*原型:void Save_tel(uchar count,uchar *p )
*功能:把從SIM卡讀到電話本存到二維數(shù)組內(nèi)
*說明:最大可存16位號(hào)碼,超出只取前面,時(shí)間0-9999分鐘
*參數(shù):uchar count-定位,*p要填寫的緩沖區(qū)
*返回:無
**************************************************/
void Save_tel(uchar count,uchar *p )
{
unsigned char i = 0;
++ count;
*p++ = 'A';
*p++ = 'T';
*p++ = 'D';
while((Uart.Buf[count]!= '"' )&&(Uart.Buf[count] != '*'))
{
if(i < TELLEN)//當(dāng)號(hào)碼長度未超過TELLEN,填寫在緩沖區(qū)內(nèi)
*p++ = Uart.Buf[count];
count++; //指向下一個(gè)接收緩沖區(qū)
}
*p++ =';';
*p = NULL;//結(jié)束
//如有預(yù)存的定時(shí)時(shí)間
if(Uart.Buf[count] =='*')
{
++count;
Time.Atd=ReadTime(&Uart.Buf[count]);//轉(zhuǎn)換成時(shí)間
}
else
{
Time.Atd = NULL;//定時(shí)標(biāo)志為0
}
}
/*************************************************
*原型:void UART_RX_interrupt(void)
*功能:接收串口數(shù)據(jù)
*說明:無
*參數(shù):無
*返回:無
**************************************************/
#pragma interrupt_handler UART_RX_interrupt:iv_USART_RX
void UART_RX_interrupt( void )
{
unsigned char data,hz1;
data = UDR;
hz1 = UART_RXHEAD;
UART_RXHEAD++;
Uart.Buf[hz1] = data; //把數(shù)據(jù)存到接收緩沖區(qū)
//如果超出范圍從頭收起
if(UART_RXHEAD>=UARTRXLEN)
UART_RXHEAD = NULL;
if((data == 'K')&&(Uart.Buf[--hz1] =='O'))
DealRxUartBz = TRUE;
//在空閑狀態(tài)來電振鈴發(fā)摘機(jī)命令起機(jī)
else if((data=='G')&&(Uart.Buf[--hz1]=='N')&&(!Busybz))
{
UART_RXHEAD = NULL; //接收計(jì)數(shù)器與號(hào)碼標(biāo)志指向空
WorkCount = GET; //任務(wù)計(jì)數(shù)器指向接聽命令
}
}
/*************************************************
*原型:void QueryState(void)
*功能:根據(jù)*ECAV的內(nèi)容判斷通話是否成功
*說明:無
*參數(shù):uchar addrssend
*返回:無
**************************************************/
void QueryState(uchar addrssend)
{
uchar count;
if(count=Bj_rx(addrssend,',',0))
{
count = count = Bj_rx(addrssend,',',++count);
count ++;
if(Uart.Buf[count] == '0')
{//接聽馬上掛機(jī)
WorkCount = RINGOFF;
Time.Sec = 1;
}
}
else //發(fā)送掛機(jī)命令
{
WorkCount = RINGOFF;//
}
}
/*************************************************
*原型:void Deal_rx(void)
*功能:處理接收到的數(shù)據(jù)
*說明:無
*參數(shù):uchar addrss-雙音計(jì)數(shù)
*返回:無
**************************************************/
void DealRxBuf(uchar addrss)
{
unsigned char count = NULL;
CLR_BIT(UCSRB,RXCIE);//關(guān)接收
switch(WorkCount)//任務(wù)指示器
{
case LINE:
case SETUPTEL:
WorkCount++;
break;
case RTEL:
//在數(shù)組從COUNT開始到ADDRSS內(nèi)查找一個(gè)字符,無找到返回0
if(count=Bj_rx(addrss,'"',count))
{
Save_tel(count,TelBuf); //讀出電話本與定時(shí)時(shí)間
WorkCount = CALLTEL;//有讀到電話本馬上去拔號(hào)處理
DealTxUartBz = TRUE;//如果未讀到電話本,紅燈亮
}
break;
case CALLTEL://拔號(hào)成功,接著查詢狀態(tài)
WorkCount = QUERY;
Time.Sec = timesec;//2000ms
break;
case QUERY://根據(jù)回應(yīng)分析狀態(tài)
QueryState(addrss);
break;
case GET://有來電接聽掛斷
WorkCount = RINGOFF;
break;
case RINGOFF://發(fā)掛機(jī)命令成功
Time.Mec = Time.Min = NULL;
Time.Sec = time3sec;//定時(shí)3秒
if(!Time.Atd)//如果無定時(shí),直接拔打下一個(gè)
{
Time.Sec = timesec;
WorkCount = CALLTEL;
}
else //否則定時(shí)未到,等待定時(shí)到再拔號(hào)
{
WorkCount = NULLACK;
}
Busybz = FALSE;
break;
}
UART_RXHEAD = NULL; //接收器指向頭
DealRxUartBz = FALSE; //串口接收處理標(biāo)志清0
SET_BIT(UCSRB,RXCIE); //開接收
}
/**************************************************
*原型:void InitUART(void)
*功能:初始化UART,接收中斷開,接收/發(fā)送口開
*參數(shù):速率為19.2k,8位數(shù)據(jù)+1位STOP位,bandrate
*返回:無
**************************************************/
void DealTx(void)
{
switch(WorkCount)
{
case LINE://建立連接
puts("ATE0");
break;
case SETUPTEL:
puts("AT+CPBS=\"SM\"");
break;
case RTEL://查找電話本
puts("AT+CPBR=1");
break;
case CALLTEL://在報(bào)警時(shí)發(fā)拔號(hào)命令
//拔號(hào)定時(shí)重新清0
puts("ATH");
delay_ms(1500);
DealRxUartBz =FALSE;
WorkCount = CALLTEL;
Time.Sec = time3sec;//定時(shí)3秒
puts(TelBuf);
Busybz = TRUE;//忙標(biāo)志置1
break;
case QUERY://查詢拔號(hào)狀態(tài)
puts("AT+CLCC");
Time.Sec = timesec;
break;
case GET://接聽
puts("ATA");//發(fā)送摘機(jī)命令
break;
case RINGOFF://掛機(jī)
puts("ATH");
break;
}
DealTxUartBz = FALSE; //已發(fā)送完,把發(fā)送標(biāo)志清0
UART_RXHEAD = NULL;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -