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

📄 gsmuart.c

📁 名厂车载GPS通信终端
💻 C
📖 第 1 页 / 共 3 页
字号:
	else if(at_con.result ==_AT_RECV_OVERTIME)
	{
		flag                   = 1;
		at_return[at_con.type] = _OVERTIME;
	}
	if(flag ==1)
	{
		if(AT_CMD[at_con.type].flag)
		{
			if(Informproc!=NULL)Informproc();
		}
		Abort_At_Cmd();
	}
}

void Inform_Ccid(void)
{
	uchar flag = 0;
	
	if(Str_Find(at_con.recvbuf,at_con.recvlen,"+CCID:"))
	{
		at_con.time =1;
	}
	else if(Str_Find(at_con.recvbuf,at_con.recvlen,"OK"))
	{
		if(at_con.time==1)
		{
			flag = 1;
			Clr_Char_Bit(&gsmstatus.mode,6);
			at_return[at_con.type] = _OK;
		}
	}
	else if(Str_Find(at_con.recvbuf,at_con.recvlen,"ERROR"))
	{
		flag = 1;
		if(Str_Find(at_con.recvbuf, at_con.recvlen,"10")||Str_Find(at_con.recvbuf, at_con.recvlen,"13"))
		{
			Set_Char_Bit(&gsmstatus.mode,6);
		}
		at_return[at_con.type] = _ERR;
	}
	else if(at_con.result ==_AT_RECV_OVERTIME)
	{
		flag                   = 1;
		at_return[at_con.type] = _OVERTIME;
	}
	if(flag ==1)
	{
		if(AT_CMD[at_con.type].flag)
		{
			if(Informproc!=NULL)Informproc();
		}
		Abort_At_Cmd();
	}
}

void Reset_GsmUart(void)
{
	uchar i;
	
	for(i=0; i<_AT_MAX_TYPE; i++)
	{
		at_return[i] = _NORETURN;
	}
	gsmuart.sendhead   = 0;
	gsmuart.sendtail   = 0;
	gsmuart.sendstatus = _IDLE;
	smssendstatus      = _IDLE;
	ring.clip          = 0;
	ring.ack           = 0;
	ring.time          = 0;
	at_cmd_buf.head    = 0;
	at_cmd_buf.tail    = 0;
	at_atding          = 0;
	recv_cmt           = 0;
	at_cmd_buf.status  = _IDLE;
	Abort_At_Cmd();
}


void Init_GsmUart(void)
{
	Reset_GsmUart();
	at_con.recvbuf = streadmbuf;
	At_Over_Timer  = Create_Timer(Deal_Inform);
}



void Uart2Tx(uchar far *ptr,uint len)
{
	uint i;
	uint  j;
	uint xlen;
	
	if(len==0) return;
	//  clr_watchdog();
	while(len!=0)
	{
		//  clr_watchdog();
		if(len>=200)
			xlen = 200;
		else
			xlen = len;
		
		i = (gsmuart.sendtail+MAXGSMSENDBUFFER-gsmuart.sendhead)%MAXGSMSENDBUFFER;
		while((MAXGSMSENDBUFFER-1-i)<xlen)
		{
			i = (gsmuart.sendtail+MAXGSMSENDBUFFER-gsmuart.sendhead)%MAXGSMSENDBUFFER;
			//   clr_watchdog();
		}
		j = gsmuart.sendtail;
		for(i=0; i<xlen; i++)
		{
			gsmuart.sendbuf[j++] = ptr[i];
			if(j>=MAXGSMSENDBUFFER) j = 0;
		}
		if(gsmstatus.gprsdata==FALSE)
		{
#ifdef  DEBUG_AT
			hand_send(ptr,xlen);
#endif
		}
		else
		{
#ifdef  DEBUG_AT
			Uart1SendHex(ptr,len);
#endif
		}
		gsmuart.sendtail = j;
		if(gsmuart.sendstatus ==_IDLE)
		{
			gsmuart.sendstatus = _BUSY;
			asm ("  INT     #15");
		}
		ptr += xlen;
		len -= xlen;
	}
	
}

void Assemble_Head_Cmd(uchar AtType)  //组帧头//
{
	Init_Stream();
	Write_Ptr_Stream(AT_CMD[AtType].string,_stringlen(AT_CMD[AtType].string));
}

void Assemble_Tail_Cmd(void)            //组帧尾//
{
	Write_Byte_Stream(0x0d);
	Write_Byte_Stream(0x0a);
}

void Abort_At_Cmd(void)
{
	uchar i;
	
	for(i=0; i<_AT_MAX_TYPE; i++)
	{
		at_return[i] = _NORETURN;
	}
	Stop_Timer(At_Over_Timer);
	at_con.type   = _AT_NONTYPE;
	at_con.time   = 0;
	at_atding     = 0;
	At_Core();
}

void At_Core(void)//some problem//
{
	AT_CMD_TCB at_tcb;
	uchar buf[5];
	uchar *ptr;
	uchar *bakptr;
	uint i,j;
	uint temp;
	uchar templen;
	uint  sendlen;
	
	if(at_cmd_buf.head==at_cmd_buf.tail)
	{
		at_cmd_buf.status = _IDLE;
	}
	if(at_cmd_buf.status ==_IDLE) return;
	bakptr = (uchar *)(&(at_tcb.type));
	
	j      = at_cmd_buf.head;
	for(i=0; i<sizeof(AT_CMD_TCB); i++)
	{
		bakptr[i] = at_cmd_buf.buf[j++];
		if(j>=MAX_AT_CMD_BUF) j=0;
	}
	at_cmd_buf.head = j;
	
	at_return[at_tcb.type] = _NORETURN;
	at_con.time   = 0;
	Assemble_Head_Cmd(at_tcb.type);
	ptr    = (uchar *)(&at_cmd_buf.buf[at_cmd_buf.head]);
	i      = at_cmd_buf.head + at_tcb.len;
	
	if(at_tcb.type==_AT_CMGS)
	{
		
		sendlen = (at_tcb.len)-ptr[0]-1;
#ifdef DEBUG_AT
		//   Uart1Send("at_core len is:");
		//   Uart1Word(at_tcb.len);
#endif
		templen = IntToStr(sendlen,buf);
		Write_Ptr_Stream(buf,templen);
		Write_Byte_Stream(0x0d);
		Uart2Tx(Get_Stream_Headptr(),Get_Stream_Len());
		Delay10ms(2);
		Init_Stream();
		if(at_tcb.len!=0)
		{
			if(i<MAX_AT_CMD_BUF)
			{
				Write_Ascii_Stream(ptr,at_tcb.len);
			}
			else
			{  
				i = i-MAX_AT_CMD_BUF;
				Write_Ascii_Stream(ptr,MAX_AT_CMD_BUF-at_cmd_buf.head);
				ptr = at_cmd_buf.buf;
				Write_Ascii_Stream(ptr,i);
			}
		}
		Write_Byte_Stream(0x1a);
		Uart2Tx(Get_Stream_Headptr(),Get_Stream_Len());
	}
	else
	{
		if(at_tcb.len!=0)
		{
			if(i<MAX_AT_CMD_BUF)
			{
				Write_Ptr_Stream(ptr,at_tcb.len);
			}
			else
			{  
				i = i-MAX_AT_CMD_BUF;
				Write_Ptr_Stream(ptr,MAX_AT_CMD_BUF-at_cmd_buf.head);
				ptr = at_cmd_buf.buf;
				Write_Ptr_Stream(ptr,i);
			}
		}
		Assemble_Tail_Cmd();
		Uart2Tx(Get_Stream_Headptr(),Get_Stream_Len());
	}
	at_cmd_buf.head = i;
#ifdef DEBUG_AT
#endif
	Start_Timer(At_Over_Timer,AT_CMD[at_tcb.type].timeout,HMSEL);
	at_con.type    = at_tcb.type;
	at_con.result  = _AT_RECV_NOTYPE;
	if(at_tcb.type==_AT_ATD)
	{
		at_atding = 1;
	}
	else
	{
		at_atding = 0;
	}
	if(AT_CMD[at_tcb.type].flag)
	{
		Informproc     = at_tcb.proc;
	}
}

void Send_At(uchar type,uchar *ptr,uint len,void far (*proc)())
{
	AT_CMD_TCB at_tcb;
	uint xlen;
	uint atsize;
	uint i,j;
	uchar *bakptr;
	
	at_tcb.type = type;
	at_tcb.len  = len;
#ifdef DEBUG_AT
	//   Uart1Send("send_at len is:");
	//   Uart1Word(len);
#endif 
	at_tcb.proc = proc;
	atsize       = sizeof(AT_CMD_TCB)+len;
	xlen = (at_cmd_buf.tail+MAX_AT_CMD_BUF-at_cmd_buf.head)%MAX_AT_CMD_BUF;
	if(atsize>=(MAX_AT_CMD_BUF-1-xlen))
	{
#ifdef DEBUG_AT
		Uart1Send("the at cmd buf is full");
		Reset_GsmUart();
#endif 
		//      if(type==_AT_CMGS)
		//      {
		//         if(sms_instack)
		//      }
        return;
	}
	//   if(type==_AT_CMGS)
	//   {
	//      if(sms_instack!=0xff)sms_instack++;
	//   }
	bakptr = (uchar *)(&(at_tcb.type));
	j      = at_cmd_buf.tail;
	for(i=0; i<sizeof(AT_CMD_TCB); i++)
	{
		at_cmd_buf.buf[j++] = bakptr[i];
		if(j>=MAX_AT_CMD_BUF) j=0;
	}
	for(i=0; i<len; i++)
	{
		at_cmd_buf.buf[j++] = ptr[i];
		if(j>=MAX_AT_CMD_BUF) j=0;
	}
	at_cmd_buf.tail = j;
	
	if(at_cmd_buf.status ==_IDLE)
	{
		at_cmd_buf.status = _BUSY;
		At_Core();
	}
}

void At_Cmd_At(void far (*proc)())
{
	Send_At(_AT_AT,NULL,0,proc);
}

void At_Cmd_Ata(void)
{
	Send_At(_AT_ATA,NULL,0,NULL);
}

void At_Cmd_Ath(void)
{
	if(at_con.type==_AT_ATD)
	{
		Abort_At_Cmd();
	}
	Send_At(_AT_ATH,NULL,0,NULL);
}

void At_Cmd_Init(void far (*proc)())
{
	Send_At(_AT_INIT,NULL,0,proc);
}

void At_Cmd_Cpof(void)
{
	Send_At(_AT_CPOF,NULL,0,NULL);
}

void At_Cmd_Vgr(uchar *ptr,uchar len)
{
	Send_At(_AT_VGR,ptr,len,NULL);
}

void At_Cmd_Cmee(void)
{
	Send_At(_AT_CMEE,NULL,0,NULL);
}

void At_Cmd_Cpin(void)  
{
	Send_At(_AT_CPIN,NULL,0,NULL);
}

void At_Cmd_Atd(uchar *ptr,uchar len)
{
	uchar buf[17];
	uchar i;
	
	for(i=0; i<len; i++)
	{
		if(ptr[i] == 'F')  //added by leon 051008
			break;
		buf[i]=ptr[i];
	}
	//buf[len]=';';
	buf[i] = ';';
	//Send_At(_AT_ATD,buf,len+1,NULL);
	Send_At(_AT_ATD,buf,i+1,NULL);
}

void At_Cmd_Cmgs(uchar *ptr,uint len,void far (*proc)())
{
#ifdef DEBUG_AT
	//Uart1Send("the len is:");
	//Uart1Word(len);
	// Uart1SendHex(ptr,len);
#endif
	Send_At(_AT_CMGS,ptr,len,proc);
}

void At_Cmd_Csq(void)
{
	Send_At(_AT_CSQ,NULL,0,NULL);
}

void At_Cmd_Creg(void)
{
	Send_At(_AT_CREG,NULL,0,NULL);
}

void At_Cmd_Creg1(void)
{
	Send_At(_AT_CREG1,NULL,0,NULL);
}

void At_Cmd_Cmgr(uchar *ptr,uchar len)
{
	Send_At(_AT_CMGR,ptr,len,NULL);
}

void At_Cmd_Cpms(uchar *ptr,uchar len)
{
	Send_At(_AT_CPMS,ptr,len,NULL);
}

void At_Cmd_Cmgd(void)
{
	Send_At(_AT_CMGD,NULL,0,NULL);
}

void At_Cmd_Cmgd_All(void)
{
	Send_At(_AT_CMGD_ALL,NULL,0,NULL);
}

void At_Cmd_Wind(void)
{
	Send_At(_AT_WIND,NULL,0,NULL);
}

void At_Cmd_Csca(uchar far *ptr,uchar len)
{
	uchar buf[20];
	uchar i;
	
	buf[0] = '"';
	for(i=0; i<len; i++)
	{
		if(ptr[i] == 'F')  //added by leon 051008
			break;
		buf[i+1] = ptr[i];
	}
	//buf[len+1] = '"';
	buf[i+1] = '"';
	//Send_At(_AT_CSCA,buf,len+2,NULL);
	Send_At(_AT_CSCA,buf,i+2,NULL);
}

void At_Cmd_Vts(uchar ch)
{
	uchar buf[1];
	if(gsmstatus.talkmode!= _TALK_ON)return;
	if(ch==0x3a){buf[0] = '*';}
	else if(ch==0x3b){buf[0]='#';}
	else {buf[0] = ch;}
	Send_At(_AT_VTS,buf,1,NULL);
}

void At_Cmd_Wopen(void far (*proc)())
{
	Send_At(_AT_WOPEN,NULL,0,proc);
}

void At_Cmd_Dlmode(void far (*proc)())
{
	Send_At(_AT_DLMODE,NULL,0,proc);
}

void At_Cmd_Gprsmode(void far (*proc)())
{
	Send_At(_AT_GPRSMODE,NULL,0,proc);
}

void At_Cmd_Apnserv(uchar *ptr,uchar len,void far (*proc)())
{
	uchar buf[25];
	uchar i;
	
	buf[0] = '"';
	for(i=0; i<len; i++)
	{
		buf[i+1] = ptr[i];
	}
	buf[len+1] = '"';
	Send_At(_AT_APNSERV,buf,len+2,proc);
}

void At_Cmd_Apnun(uchar *ptr,uchar len ,void far (*proc)(void))
{
	uchar buf[25];
	uchar i;
	
	buf[0] = '"';
	for(i=0; i<len; i++)
	{
		buf[i+1] = ptr[i];
	}
	buf[len+1] = '"';
	Send_At(_AT_APNUN,buf,len+2,proc);
}

void At_Cmd_Apnpw(uchar *ptr,uchar len,void far (*proc)())
{
	uchar buf[25];
	uchar i;
	
	buf[0] = '"';
	for(i=0; i<len; i++)
	{
		buf[i+1] = ptr[i];
	}
	buf[len+1] = '"';
	Send_At(_AT_APNPW,buf,len+2,proc);
}

void At_Cmd_Tcbserv(uchar *ptr,uchar len,void far (*proc)())
{
	uchar buf[25];
	uchar i;
	
	buf[0] = '"';
	for(i=0; i<len; i++)
	{
		buf[i+1] = ptr[i];
	}
	buf[len+1] = '"';
	Send_At(_AT_TCPSERV,buf,len+2,proc);
}

void At_Cmd_Tcbport(uchar *ptr,uchar len,void far (*proc)())
{
	Send_At(_AT_TCPPORT,ptr,len,proc);
}

void At_Cmd_Cgatt(void far (*proc)())
{
	Send_At(_AT_CGATT,NULL,0,proc);
}

void At_Cmd_Cgatt1(void far (*proc)())
{
	Send_At(_AT_CGATT1,NULL,0,proc);
}

void At_Cmd_Connectionstart(void far (*proc)())
{
	Send_At(_AT_CONNECTIONSTART,NULL,0,proc);
}

void At_Cmd_Otcp(void far (*proc)())
{
	Send_At(_AT_OTCP,NULL,0,proc);
}

void At_Cmd_Ccid(void far (*proc)())

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -