📄 gsmuart.c
字号:
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 + -