⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isr.c

📁 利用ATMEGA128芯片的双串口
💻 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 + -