📄 isr.c
字号:
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/signal.h>
#include <avr/eeprom.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "logic.h"
extern unsigned char ErrorType;
extern unsigned char smsDataCnt;
extern unsigned int _1msCounter;
extern unsigned char rs232DataCnt;
extern unsigned char UART1Index;
extern unsigned char UART0Index;
extern unsigned char uart1Data[255]; /*only save the data from slave slave*/
extern unsigned char rs232Data[255];
extern unsigned char uart1_rcvDATA[1024];
extern unsigned char Uart1SendFlag;
extern unsigned char Uart0SendFlag;
extern unsigned int TimeOut;
extern unsigned char ReConn_Cnt;
extern unsigned char GPRSOKFlag;
extern unsigned char ATSENDFlag;
extern unsigned char GPRS_Status;
extern unsigned char GPRS_Working_Status;
extern unsigned char _10msFlag;
extern unsigned char _10msCnt;
extern unsigned char Read_Pointer=0;
extern unsigned char Write_Pointer=0;
extern unsigned char Read_Pointer1=0;
extern unsigned char Write_Pointer1=0;
extern unsigned char uart1_rcvdataLen;
extern enum{
HandShake=0,
Active,
Inquire,
WaitTimeOut,
Error
}unitState[10],LastState; //设备状态
/*Intern Variable List*/
static unsigned char rs232_rx_buf[256]; // the buffer for UART0 Recive
static unsigned char uart1_rx_buf[256];// the buffer for UART1 Recieve
void RS232Receive(void);
void Receive(void);
//extern void puts1(unsigned char *str,unsigned char length); /*transmit data to slave during UART1*/
SIGNAL(USART0_RX_vect)
{
unsigned char c;
CLI();
c=UDR0;
putchar(c);
rs232_rx_buf[Write_Pointer++]=c;
if(Write_Pointer>250) Write_Pointer=0;
SEI();
}
SIGNAL(USART0_TX_vect)
{
}
SIGNAL(TIMER1_OVF_vect)
{
unsigned char temp;
TCNT1=_1MS_INTERRUPT;
if(_1msCounter>0)
_1msCounter--;
if(TimeOut>0)
TimeOut--;
if(_10msCnt>0) _10msCnt--;
else
{
_10msFlag=1;
_10msCnt=10;
}
}
SIGNAL(USART1_RX_vect)
{
unsigned char c;
CLI();
c=UDR1;
if(GPRS_Status!=STATE_GPRS_CONNECT) putchar0(c);
else
{
uart1_rx_buf[Write_Pointer1++]=c;
if(Write_Pointer1>250) Write_Pointer1=0;
}
SEI();
}
SIGNAL(USART1_TX_vect)
{
}
SIGNAL(TIMER0_OVF_vect)
{
}
/******************************************************************
Name: RS232Receive
Input: none
Output: none
Function:
receive data from UART0
*******************************************************************/
void RS232Receive(void)
{
unsigned char RcvFlag;
unsigned char ReadFlag;
unsigned char Sign_Quality,InsertCardOK,CardOK;
unsigned char urcCause,urcInfoID;
unsigned char *RcvDataReady;
unsigned char *SndDataReady;
unsigned char *SocketError;
unsigned char *SIMError;
unsigned char *ReadData;
unsigned int i,j,k,iLen;
unsigned char rcvDATA[255];
RcvFlag=0;
ReadFlag=0;
iLen=0;
RcvDataReady=(unsigned char *)"^SISR: 0, 1";
SndDataReady=(unsigned char *)"^SISW:";
SocketError=(unsigned char *)"^SIS: 0, 0, ";
ReadData=(unsigned char *)"at^sisr=0,250";
SIMError=(unsigned char *)"+CME ERROR: ";
while(Read_Pointer!=Write_Pointer&&RcvFlag==0)
{
rs232Data[UART0Index++]=rs232_rx_buf[Read_Pointer++];
if(UART0Index>1)
{
if(rs232Data[UART0Index-2]==13&&rs232Data[UART0Index-1]==10)
RcvFlag=1;
}
if(Read_Pointer>250) Read_Pointer=0;
}
if(RcvFlag)
{
RcvFlag=0;
if(UART0Index>=3)
{
for(i=0;i<UART0Index-2;i++)
rcvDATA[i]=rs232Data[i];
iLen=i-1;
}
UART0Index=0;
if(iLen>0)
{
if((rcvDATA[iLen-1]==0x4F)&&(rcvDATA[iLen]==0x4B))
{//Recieved OK
switch(GPRS_Status)
{
case STATE_GPRS_START:
GPRS_Status=STATE_CPRS_SET_CMEE;
ATSENDFlag=0;
ReConn_Cnt=20;
break;
case STATE_CPRS_SET_CMEE:
GPRS_Status=STATE_GPRS_TEST_CSQ;
ATSENDFlag=0;
ReConn_Cnt=20;
TimeOut=1000;
break;
case STATE_GPRS_TEST_CSQ:
TimeOut=1000;
break;
case STATE_GRPS_CHECKCARD:
TimeOut=1000;
break;
case STATE_CPRS_GET_SIMID:
GPRS_Status=STATE_GPRS_SET_CONTYPE;
ATSENDFlag=0;
ReConn_Cnt=20;
TimeOut=1000;
break;
case STATE_GPRS_SET_CONTYPE:
GPRS_Status=STATE_GPRS_SET_USER;
ATSENDFlag=0;
ReConn_Cnt=20;
TimeOut=1000;
break;
case STATE_GPRS_SET_USER:
GPRS_Status=STATE_GPRS_SET_PWD;
ATSENDFlag=0;
ReConn_Cnt=20;
TimeOut=1000;
break;
case STATE_GPRS_SET_PWD:
GPRS_Status=STATE_GPRS_SET_APN;
ATSENDFlag=0;
ReConn_Cnt=20;
TimeOut=1000;
break;
case STATE_GPRS_SET_APN:
GPRS_Status=STATE_GPRS_SET_SRVTYPE;
ATSENDFlag=0;
ReConn_Cnt=20;
TimeOut=1000;
break;
case STATE_GPRS_SET_SRVTYPE:
GPRS_Status=STATE_GPRS_SET_SRVCONID;
ATSENDFlag=0;
ReConn_Cnt=20;
TimeOut=1000;
break;
case STATE_GPRS_SET_SRVCONID:
GPRS_Status=STATE_GPRS_SET_ADDRESS;
TimeOut=1000;
break;
case STATE_GPRS_SET_ADDRESS:
GPRS_Status=STATE_GPRS_CONN_OPEN;
ATSENDFlag=0;
TimeOut=50000;
break;
case STATE_GPRS_CONN_OPEN:
GPRS_Status=STATE_GPRS_CONNECT;
ATSENDFlag=0;
ReConn_Cnt=20;
TimeOut=1000;
break;
case STATE_GPRS_CONNECT:
switch(GPRS_Working_Status)
{
case STATE_GPRS_WORKIDLE:
break;
case STATE_GPRS_WRITE_DATA:
GPRS_Working_Status=STATE_GPRS_WORKIDLE;
break;
case STATE_GPRS_READ_DATA:
Uart0SendFlag=0x01;
puts0(ReadData,13);
Send_Return_NewLine();
break;
}
break;
case STATE_GPRS_DISCONNECT:
GPRS_Status=STATE_GPRS_CONN_OPEN;
GPRS_Working_Status=STATE_GPRS_WORKIDLE;
ATSENDFlag=0;
TimeOut=1000;
break;
case STATE_GPRS_SHUTDOWN:
GPRS_Status=STATE_DEVICE_INIT;
TimeOut=1000;
break;
}//end switch GPRS_Status
}//end OK
else
{//Received NewLine
switch(GPRS_Status)
{
case STATE_GPRS_TEST_CSQ:
if(rcvDATA[7]==0x2C)
{
Sign_Quality=rcvDATA[6]-0x30;
puts1("The GPRS SIGNAL QUALITY is ",28);
putchar(rcvDATA[6]);
putchar(0x0D);
putchar(0x0A);
}
if(rcvDATA[8]==0x2C)
{
Sign_Quality=(rcvDATA[6]-0x30)*10+(rcvDATA[7]-0x30);
puts1("The GPRS SIGNAL QUALITY is ",28);
putchar(rcvDATA[6]);
putchar(rcvDATA[7]);
putchar(0x0D);
putchar(0x0A);
}
if(Sign_Quality>5&&Sign_Quality<=31)
{
GPRS_Status=STATE_GRPS_CHECKCARD;
ATSENDFlag=0;
ReConn_Cnt=20;
}
break;
case STATE_GRPS_CHECKCARD:
InsertCardOK=rcvDATA[9]-0x30;
if(InsertCardOK==1)
{
GPRS_Status=STATE_CPRS_GET_SIMID;
ATSENDFlag=0;
ReConn_Cnt=20;
}
if(InsertCardOK==0)
{
puts1("The GPRS has not been inserted SIM Card !",41);
putchar(0x0D);
putchar(0x0A);
}
break;
case STATE_GPRS_CONNECT:
switch(GPRS_Working_Status)
{
case STATE_GPRS_WORKIDLE:
if(iLen==11)
{
for(i=0;i<iLen;i++)
{
if(*RcvDataReady++!=rcvDATA[i]) break;
}
if(iLen==i)
{
Uart0SendFlag=0x01;
puts0(ReadData,13);
Send_Return_NewLine();
GPRS_Working_Status=STATE_GPRS_READ_DATA;
}
}
if(iLen>12)
{
for(i=0;i<12;i++)
{
if(*SocketError++!=rcvDATA[i]) break;
//if(*SIMError++!=rcvDATA[i]) break;
}
if(i>10&&rcvDATA[9]==0x30)GPRS_Status=STATE_GPRS_DISCONNECT;
//if(i==12)GPRS_Status=STATE_GPRS_SHUTDOWN;
}
break;
case STATE_GPRS_WRITE_DATA:
if(rcvDATA[0]==0x5E&&iLen>6)
for(i=0;i<6;i++)
{
if(*SndDataReady++!=rcvDATA[i]) break;
}
if(i==6)// the valid write data signal
{
//Uart0SendFlag=0x01;
//puts0("Hi,I'am Alive.");
for(k=0;k<uart1_rcvdataLen;k++) putchar0(uart1_rcvDATA[k]);
}
if(rcvDATA[0]==0x2B&&rcvDATA[1]==0x43&&iLen>12)
for(i=0;i<12;i++){if(*SIMError++!=rcvDATA[i]) break;}
if(i==12)GPRS_Status=STATE_GPRS_SHUTDOWN;
break;
case STATE_GPRS_READ_DATA:
if(iLen>10)
{
if(rcvDATA[0]==0x5E&&rcvDATA[1]==0x53
&&rcvDATA[2]==0x49&&rcvDATA[3]==0x53
&&rcvDATA[4]==0x52&&rcvDATA[5]==0x3A)
{
Uart1SendFlag=0x01;
ReadFlag=1;
puts1("GRPS READ DATA:",15);
if(rcvDATA[11]==0x0D)
{
Uart1SendFlag=0x01;
puts1("Total ",6);
putchar(rcvDATA[10]);
Uart1SendFlag=0x01;
puts1(" bytes");
if(rcvDATA[10]==0x30)
{//all data in buffer be read finished
GPRS_Working_Status=STATE_GPRS_WORKIDLE;
}
}
if(rcvDATA[12]==0x0D)
{
Uart1SendFlag=0x01;
puts1("Total ",6);
putchar(rcvDATA[10]);
putchar(rcvDATA[11]);
Uart1SendFlag=0x01;
puts1(" bytes");
}
if(rcvDATA[13]==0x0D)
{
Uart1SendFlag=0x01;
puts1("Total ",6);
putchar(rcvDATA[10]);
putchar(rcvDATA[11]);
putchar(rcvDATA[12]);
Uart1SendFlag=0x01;
puts1(" bytes");
}
putchar(0x0D);
putchar(0x0A);
}
}
else
{
if(ReadFlag)
{
ReadFlag=0;
Uart1SendFlag=0x01;
puts1("They are: ",10);
}
for(i=0;i<iLen;i++) putchar(rcvDATA[i]);
putchar(0x0D);
putchar(0x0A);
}
break;
}//end Switch GPRS Work status
break;
}//end Switch GPRS_Status
}//end iLen>1 NewLine
}//end Ilen>1
}//end RcvFlag
}
/******************************************************************
Name: Receive
Input: none
Output: none
Function:
receive data from UART1
*******************************************************************/
void Receive(void)
{
unsigned char RcvFlag;
unsigned int i,iLen;
unsigned char *GPRS_Write;
GPRS_Write=(unsigned char*)"at^sisw=0,";
RcvFlag=0;
iLen=0;
while(Read_Pointer1!=Write_Pointer1)
{
uart1Data[UART1Index++]=uart1_rx_buf[Read_Pointer1++];
if(Read_Pointer1>250) Read_Pointer1=0;
if(UART1Index>1&&(uart1Data[0]!=0x6A||uart1Data[1]!=0xFF)) UART1Index=0;
if(UART1Index>16&&UART1Index>=uart1Data[16]+19) break;
}
if(UART1Index>=uart1Data[16]+19)
{
for(i=0;i<UART1Index;i++)
uart1_rcvDATA[i]=uart1Data[i];
iLen=UART1Index;
UART1Index=0;
RcvFlag=1;
}
if(RcvFlag)
{
RcvFlag=0;
if(GPRS_Status==STATE_GPRS_CONNECT)
{
Uart0SendFlag=0x01;
puts0(GPRS_Write,10);
if((iLen/1000)>0&&(iLen/1000)<10)
{
putchar0(iLen/1000+0x30);
putchar0((iLen%1000)/100+0x30);
putchar0((iLen%100)/10+0x30);
putchar0(iLen%10+0x30);
}
if((iLen/100)>0&&(iLen/100)<10)
{
putchar0(iLen/100+0x30);
putchar0((iLen%100)/10+0x30);
putchar0(iLen%10+0x30);
}
if((iLen/10)>0&&(iLen/10)<10)
{
putchar0(iLen/10+0x30);
putchar0(iLen%10+0x30);
}
if(iLen<10)
{
putchar0(iLen+0x30);
}
Send_Return_NewLine();
ATSENDFlag=1;
TimeOut=5000;
uart1_rcvdataLen=iLen;
GPRS_Working_Status=STATE_GPRS_WRITE_DATA;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -