📄 uart.c
字号:
Returns: none
Description: clear txata.txbuf;
************************************************************************************/
void clr_txbuf(void)
{int i;
for(i=0;i<TXBUFSIZE;i++)txbuf[i]=0;
}
/************************************************************************************
Name: init_glb_val
Parameters: none
Returns: none
Description:
************************************************************************************/
void init_glb_val(void)
{
timxcount=0;
seccount=0;
timycount[0]=0;
timycount[1]=0;
uirxcount[0]=0;
uirxcount[1]=0;
uitxcount[0]=0;
uitxcount[1]=0;
u0count=0;
u1count=0;
uinumoftx[0]=0;
}
void gsm_IGT(char ui,unsigned int timout)
{ char overtime;
again: overtime=0;
p1_2=1;
delay(500);
p1_2=0;
send_str(ui,"AT\r");
while(timycount[ui]<timout)
{
if(sch_str(ui,"\r\nOK\r\n")!=0)
{
overtime=1;
break;
}
if(sch_str(ui,"ERROR\r\n")!=0)
{
overtime=1;
break;
}
}
if(overtime==0) goto again;
}
char sch_pho_num(char ui,char *meteraddr,SM_PARAM* pSrc,int timout)
{
char *ptr,result,k;
char buf[10],index[4];
int i;
if(ui==0)ptr=u0rxbuf;
else if(ui==1)ptr=u1rxbuf;
result=0;
i=1;
while(i<200)
{
strncpy(buf,"AT+CPBR=\0",9);
int2str1(i,index);
strcat(buf,index);
strcat(buf,"\r\0");
if(sendATdata(ui,buf,"\r\nOK\r\n","ERROR\r\n",timout)>0)
{
if(uirxcount[ui]>10)
{
if(sch_str(ui,meteraddr)==1)
{
ptr=strstr(ptr,"+CPBR: ");
ptr+=7;
ptr=strstr(ptr,"\"");
ptr+=1;
k=0;
while(*ptr!='"'&&k<16)
{
pSrc->TPA[k]=*ptr;
ptr++;
k++;
}
pSrc->TPA[k]='\0';
result=1;
break;
}
}
else break;
}
else break;
i++;
}
return(result);
}
void delay_reset(void)
{
timycount[2]=0;
}
void delay(unsigned int nms)
{
delay_reset();
while(timycount[2]<=nms){}
}
unsigned int get_bat_volt(void)
{
unsigned int tp,bat_volt,i;
bat_volt=0;
for(i=0;i<16;i++)
{
adcon0=0x80;
adcon1=0x28;
adst=1;
while(adst==1){}
tp=ad;
bat_volt+=tp;
delay(10);
}
bat_volt=bat_volt>>4;
return(bat_volt);
}
void gsm_poweron()
{
p1_2=1;
delay(500);
p1_2=0;
}
void gsm_poweroff(char ui,unsigned int timout)
{
if(sendATcom(ui,"AT^SMSO\r","MS OFF OK","ERROR",timout)<=0)
{
p1_3=0;
delay(5000);
p1_3=1;
}
}
unsigned int bat_charge(void)
{ unsigned int volt;
volt=get_bat_volt();
if(volt<690)
{
gsm_poweroff(0,1000);
p3_1=0;
p3_3=0;
}
else if(volt>716&&volt<818)
{
gsm_poweron();
flag.bit.chargestar=1;
flag.bit.chargeend=0;
p3_1=0;
p3_3=0;
}
else if(volt>818&&volt<860)
{
p3_1=1;
p3_3=0;
}
else if(volt>860&&flag.bit.chargestar==1)
{flag.bit.chargestar=0;
flag.bit.chargeend=0;
seccount=0;
p3_3=1;
p3_1=1;
}
else if(volt>880 && flag.bit.chargeend==0 && seccount>36000)
{
flag.bit.chargeend=1;
flag.bit.chargestar=0;
p3_1=0;
p3_3=0;
}
return(volt);
}
unsigned char calc_cs(unsigned char *ptr)
{unsigned char cs,len,i;
cs=0;
len=ptr[9]+10;
for(i=0;i<len;i++) cs+=ptr[i];
return(cs);
}
unsigned char check_cs(unsigned char *ptr)
{unsigned char cs,len,i;
cs=0;
len=ptr[9]+10;
for(i=0;i<len;i++) cs+=ptr[i];
if(cs==ptr[len])return(1);
else return(0);
}
char sms_2_645(unsigned char *pSr,unsigned char *pDs)
{ unsigned char *ptr;
ptr=pDs;
if((pSr=strstr(pSr,"MA"))!=0)
{
pSr+=2;
*ptr++=0x68;
gsmString2Bytes(pSr,ptr,12);
ptr+=6;
}
else return(0);
if((pSr=strstr(pSr,"RD"))!=0)
{
pSr+=2;
*ptr++=0x68;
*ptr++=0x01;
*ptr++=0x02;
gsmString2Bytes(pSr,ptr,4);
ptr+=2;
}
else return(0);
*ptr++=calc_cs(txbuf);
*ptr=0x16;
return(txbuf[9]+12);
}
char decodemsg(char ui,SM_PARAM* pSrc,unsigned int timout)
{ unsigned char frame_len,*ptr,result,k,data_len;
result=0;
if(pSrc->TP_DCS==GSM_8BIT)
{
frame_len=pSrc->TP_UD[9]+12;
send_n_byte(ui,pSrc->TP_UD,frame_len);
while(flag.bit.u0txbusy==1){}
delay(20);
REDI=1;
while(1)
{
frame_len=sch_645_frame(ui,pSrc->TP_UD);
if(frame_len>0)
{ result=frame_len;
pSrc->TP_UD[frame_len]='\0';
break;
}
if(timycount[ui]>timout) break;
}
}
else if(pSrc->TP_DCS==GSM_7BIT||pSrc->TP_DCS==GSM_UCS2)
{
frame_len=sms_2_645(pSrc->TP_UD,txbuf);
send_n_byte(ui,txbuf,frame_len);
while(flag.bit.u0txbusy==1){}
delay(20);
REDI=1;
while(1)
{
frame_len=sch_645_frame(ui,txbuf);
if(frame_len>0)
{ result=frame_len;
ptr=pSrc->TP_UD;
*ptr++='M';
*ptr++='A';
frame_len=gsmBcd2Str(&txbuf[1],ptr,6);
ptr+=frame_len;
*ptr++='R';
*ptr++='D';
frame_len=gsmBytes2String(&txbuf[10],ptr,2);
ptr+=frame_len;
*ptr++=':';
data_len=txbuf[9]-2;
for(k=0;k<data_len;k++) txbuf[12+k]-=0x33;
frame_len=gsmBcd2Str(&txbuf[12],ptr,data_len-2);
ptr+=frame_len;
*ptr++='.';
frame_len=gsmBcd2Str(&txbuf[14+data_len],ptr,1);
ptr+=frame_len;
*ptr++='K';
*ptr++='w';
*ptr++='h';
*ptr++='\0';
break;
}
if(timycount[ui]>timout) break;
}
}
return(result);
}
unsigned char string2char(unsigned char * src)
{
unsigned char number,pow;
unsigned char *ptr;
pow=1;
number=0;
ptr=src;
while(*ptr>='0'&&*ptr<='9')ptr++;
ptr--;
while(ptr!=src)
{
number+=(*ptr-'0')*pow;
pow*=10;
ptr--;
}
number+=(*ptr-'0')*pow;
return(number);
}
void char2string(unsigned char src, char* pDst)
{
unsigned char index;
index=(unsigned char)src/100;
src=src%100;
if(index!=0)*pDst++=tab[index];
index=(unsigned char)src/10;
src=src%10;
if(index!=0)*pDst++=tab[index];
*pDst++=tab[src];
*pDst= '\0';
}
char sch_phobook(char ui,int timout)
{unsigned char i;
max_phone=0;
max_addr=0;
i=1;
if(sendATcom(ui,"AT+CPBS=\"SM\"\r","\r\nOK\r\n","ERROR\r\n",timout)>0)
{
while(i<100)
{
strncpy(txbuf,"AT+CPBR=",8);
char2string(i,&txbuf[8]);
strcat(txbuf,"\r\0");
if(sendATdata(ui,txbuf,"\r\nOK\r\n","ERROR\r\n",timout)>0)
{if(uirxcount[ui]<8) break;
else{
if(sch_str(ui,"\"MA\"")>0||sch_str(ui,"\"ma\"")>0)
{
if(sch_str(ui,"+CPBR: ")>0) m_addr[max_addr++].index=i;
}
else if(sch_str(ui,"\"PH\"")>0||sch_str(ui,"\"pa\"")>0)
{
if(sch_str(ui,"+CPBR: ")>0) n_phone[max_phone++]=i;
}
}
}//end if
i++;
}//end while
}//end if
return((unsigned char)i);
}
char read_phobook(char ui,unsigned char index,char* pdst,unsigned int timout)
{char *ptr,result;
unsigned char k;
result=0;
if(ui==0)ptr=u0rxbuf;
else if(ui==1)ptr=u1rxbuf;
if(sendATcom(ui,"AT+CPBS=\"SM\"\r","\r\nOK\r\n","ERROR\r\n",timout)>0)
{
strncpy(txbuf,"AT+CPBR=",8);
char2string(index,&txbuf[8]);
strcat(txbuf,"\r\0");
if(sendATdata(ui,txbuf,"\r\nOK\r\n","ERROR\r\n",timout)>0)
{
if(sch_str(ui,"\"MA\"")>0||sch_str(ui,"\"ma\"")>0)
{
ptr=strstr(ptr,"+CPBR: ");
ptr+=7;
ptr=strstr(ptr,"\"");
ptr+=1;
gsmStr2Bcd(ptr,pdst,12);
result=6;
}
else if(sch_str(ui,"\"PH\"")>0||sch_str(ui,"\"ph\"")>0)
{
ptr=strstr(ptr,"+CPBR: ");
ptr+=7;
ptr=strstr(ptr,"\"");
ptr+=1;
k=0;
while(*ptr!='\"' && k<15)
{
if(*ptr=='+')ptr++;
else *pdst++=*ptr++;
k++;
}
*pdst='\0';
result=k;
}
}
}
return(result);
}
/************************************************************************************
Name: test_gsm
Parameters: none
return: none
Description: initial the GSM modle
************************************************************************************/
void test_gsm(char ui,unsigned int timeout)
{
//set baud;
if(sendATcom(ui,"AT+IPR?\r","\r\nOK\r\n","ERROR\r\n",timeout)>0)
{
if(sch_str(ui,"+IPR: 9600")<=0)
sendATcom(ui,"AT+IPR=9600\r","\r\nOK\r\n","ERROR\r\n",timeout);
}
//SET CSMS
if(sendATcom(ui,"AT+CSMS?\r","\r\nOK\r\n","ERROR\r\n",timeout)>0);
{
if(sch_str(ui,"+CSMS: 0")>0)
sendATcom(ui,"AT+CSMS=1\r","\r\nOK\r\n","ERROR\r\n",timeout);
sendATcom(ui,"AT+CNMI=2,1,0,0,1\r","\r\nOK\r\n","ERROR\r\n",timeout);
sendATcom(ui,"AT+CNMI?\r","\r\nOK\r\n","ERROR\r\n",100);
}
//SET CMGC
if(sendATcom(ui,"AT+CMGF?\r","\r\nOK\r\n","ERROR\r\n",timeout)>0);
{
if(sch_str(ui,"+CMGF: 0")<=0)
sendATcom(ui,"AT+CMGF=0\r","\r\nOK\r\n","ERROR\r\n",timeout);
}
//SET CMGL
//
if(sendATcom(ui,"AT+CPMS=\"ME\",\"SM\",\"ME\"\r","\r\nOK\r\n","ERROR\r\n",100)>0)
{
}
}
void get_meminfo(char ui,unsigned int timeout)
{char *ptr,i,tp[5];
if(ui==0)ptr=u0rxbuf;
else if(ui==1)ptr=u1rxbuf;
if(sendATcom(ui,"AT+CPMS?\r","\r\nOK\r\n","ERROR\r\n",timeout)>0)
{
ptr=strstr(ptr,"+CPMS: ");
ptr+=7;
i=0;
while(*ptr!=','&& i<5)
{
gsmstat.lrd_mem[i]=*ptr++;
i++;
}
gsmstat.lrd_mem[i]='\0';
i=0;
ptr++;
while(*ptr!=','&&i<3)
{
tp[i]=*ptr++;
i++;
}
tp[i]='\0';
gsmstat.lrd_used=string2char(tp);
i=0;
ptr++;
while(*ptr!=','&&i<3)
{
tp[i]=*ptr++;
i++;
}
tp[i]='\0';
gsmstat.lrd_totle=string2char(tp);
i=0;
ptr++;
while(*ptr!=','&&i<5)
{
gsmstat.rw_mem[i]=*ptr++;
i++;
}
gsmstat.rw_mem[i]='\0';
i=0;
ptr++;
while(*ptr!=','&&i<3)
{
tp[i]=*ptr++;
i++;
}
tp[i]='\0';
gsmstat.rw_used=string2char(tp);
i=0;
ptr++;
while(*ptr!=','&&i<3)
{
tp[i]=*ptr++;
i++;
}
tp[i]='\0';
gsmstat.rw_totle=string2char(tp);
i=0;
ptr++;
while(*ptr!=','&&i<5)
{
gsmstat.rec_mem[i]=*ptr++;
i++;
}
gsmstat.rec_mem[i]='\0';
i=0;
ptr++;
while(*ptr!=','&&i<3)
{
tp[i]=*ptr++;
i++;
}
tp[i]='\0';
gsmstat.rec_used=string2char(tp);
i=0;
ptr++;
while(*ptr!='\r'&&i<3)
{
tp[i]=*ptr++;
i++;
}
tp[i]='\0';
gsmstat.rec_totle=string2char(tp);
}
}
/************************************************************************************
Name: delt_allmsg
Parameters: none
return: none
Description: initial the GSM modle
************************************************************************************/
void delt_allmsg(char ui)
{
unsigned char i;
get_meminfo(ui,100);
if(gsmstat.lrd_used>0)
{
if(sendATcom(ui,"AT+CPMS=\"ME\",\"SM\",\"SM\"\r","\r\nOK\r\n","ERROR\r\n",100)>0)
{
for(i=1;i<=gsmstat.lrd_used;i++)
gsmDeleteMessage(ui,i,50000);
}
}
}
/************************************************************************************
Name: check_mstat
Parameters: none
return: none
Description: initial the GSM modle
************************************************************************************/
char check_mstat(char *com645stat,unsigned int timout)
{unsigned char i,*ptr,cs;
char maddrbuf[20];
char m_stat[3];
for(i=0;i<max_addr;i++)
{ ptr=txbuf;
*ptr++=0x68;
read_phobook(1,m_addr[i].index,ptr,100);
ptr+=6;
*ptr++=0x68;
*ptr++=0x01;//extern 645 com
*ptr++=0x02;
*ptr++=0xe6;
*ptr++=0x2a;
*ptr++=calc_cs(txbuf);
*ptr=0x16;
send_n_byte(0,txbuf,14);
while(sch_645_frame(0,txbuf)<4)
{
}
if(check_cs(txbuf)>0)
{
m_stat[0]=txbuf[12];
m_stat[1]=txbuf[13];
m_stat[2]=txbuf[14];
m_stat[3]=txbuf[15];
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -