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

📄 uart.c

📁 这是一个利用短信实现抄表的工程的源码,单片机通过串口与TC35通讯.同时单片机通过485与表记通讯,获得表记数据后以短信的形式发给用户.
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -