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

📄 sms232.c

📁 用W77E58开发的单片机短信收发代码
💻 C
📖 第 1 页 / 共 2 页
字号:

uchar htod(uchar hnumber)
{
   	 uchar i;
   	 switch(hnumber)
     {
        case 'A':
           i=10;
        break;
     
        case 'B':
           i=11;
        break;

        case 'C':
           i=12;
        break;

        case 'D':
           i=13;
        break;

        case 'E':
           i=14;
        break;

        case 'F':
           i=15;
        break;

        default:   
           i=hnumber-0x30;
        break;
     }
    return(i);    
}


bit sendmsg_touser(void)
{
   uint i,j;
   uchar a;
   uchar msgtype;
   uchar mymsg[4];
   i=MOBILE_BASE_ADDRESS+5;
   j=TEMP_BASE_ADDRESS;
   
   do{
	   dog();
	   if(i>=MAX_SRAM_ADDRESS)return(1);
	   if(XBYTE[i-5]!='+') {i=i+1;continue;}
	   if(XBYTE[i-4]!='C') {i=i+2;continue;}
	   if(XBYTE[i-3]!='M') {i=i+3;continue;}
	   if(XBYTE[i-2]!='T') {i=i+4;continue;}
	   if(XBYTE[i-1]!=':') {i=i+5;continue;}
       break;
     }while(1);
   
   while(XBYTE[i]!='\"')
   {
     dog();
     i++;
     if(i>=MAX_SRAM_ADDRESS)return(1);
   }	

   i++;
   if(i>=MAX_SRAM_ADDRESS)return(1);
   
   while(XBYTE[i]!='\"')      //把手机号码存到临时缓冲区
   {
     dog();
     if(j>=MOBILE_BASE_ADDRESS)return(1);
     XBYTE[j]=XBYTE[i];
     i++;
     j++;
     if(i>=MAX_SRAM_ADDRESS)return(1);
   }	
   i++;
   if(i>=MAX_SRAM_ADDRESS)return(1);

   for(a=0;a<2;a++)
   {
	   while(XBYTE[i]!='\"')      
	   {
	     dog();
	     i++;
	     if(i>=MAX_SRAM_ADDRESS)return(1);
	   }	
	   i++;
	   if(i>=MAX_SRAM_ADDRESS)return(1);
   }

   for(a=0;a<4;a++)
   {
	   while(XBYTE[i]!=',')
	   {
	     dog();
	     i++;
	     if(i>=MAX_SRAM_ADDRESS)return(1);
	   }	
	   i++;
	   if(i>=MAX_SRAM_ADDRESS)return(1);
   }
   
   msgtype=XBYTE[i];

   if(j>=MOBILE_BASE_ADDRESS)return(1);
   XBYTE[j]=',';              //把,存到临时缓冲区
   j++;
   
   while(XBYTE[i]!='\n')
   {
     dog();
     i++;
     if(i>=MAX_SRAM_ADDRESS)return(1);
   }	
   i++;
   if(i>=MAX_SRAM_ADDRESS)return(1);
    
   if(msgtype=='0')
   {
	   while(XBYTE[i]!='\r')     //把信息内容存到临时缓冲区
	   {
	     dog();
	     if(j>=MOBILE_BASE_ADDRESS)return(1);
	     XBYTE[j]=XBYTE[i];
	     i++;
	     j++;
	     if(i>=MAX_SRAM_ADDRESS)return(1);
	   }	
	}
	else if(msgtype=='8')
    {
       a=0;
	   while(XBYTE[i]!='\r')     //把信息内容存到临时缓冲区
	   {
 	       dog();
 	       mymsg[a]=XBYTE[i];
	       i++;
	       if(i>=MAX_SRAM_ADDRESS)return(1);
	       a++;
	       if(a==4)
	       {
		     a=0;
		     mymsg[2]=htod(mymsg[2]);
		     mymsg[3]=htod(mymsg[3]);
		     if(j>=MOBILE_BASE_ADDRESS)return(1);
		     XBYTE[j]=mymsg[2]*16+mymsg[3];
		     j++;
	       }	
	   }
    }


   ComOutChar0('\n');        //发送启始字符LF
   ComOutChar0('0');         //发送识别符,0(ASCII)表示向用户发的是信息

   for(i=TEMP_BASE_ADDRESS;i<j;i++)
   {
     ComOutChar0(XBYTE[i]); 
   } 
   
   ComOutChar0('\r');        //发送结束字符CR
   return(0);
}	

/**************************************************
串口0中断
**************************************************/


void Int_serial0() interrupt 4 using 1
{
   if(RI)
   {
     RI=0;
     if((user_command==0) && (SBUF=='\n'))
     {
		seri0_rnum=USER_BASE_ADDRESS;
        XBYTE[seri0_rnum]=SBUF;
 	    do{
		     while(RI==0);
	         RI=0;
             seri0_rnum++;
		     if(seri0_rnum>=TEMP_BASE_ADDRESS){do{;}while(1);}
		     XBYTE[seri0_rnum]=SBUF;
 	      }while(XBYTE[seri0_rnum]!='\r');
        user_command=XBYTE[USER_BASE_ADDRESS+1];
	 }    
   }
}

/**************************************************
串口1中断
**************************************************/
void Int_serial1() interrupt 7 using 2
{
   if(RI_1)
   {
     RI_1=0;
     if(seri1_rnum>=MAX_SRAM_ADDRESS){seri1_rnum=MOBILE_BASE_ADDRESS;goto serial1_end;}
     XBYTE[seri1_rnum]=SBUF1;
     seri1_rnum++;
     if(seri1_rnum>=(MOBILE_BASE_ADDRESS+2))
	 {
		if(XBYTE[seri1_rnum-2]!='\r')goto serial1_begin;
		if(XBYTE[seri1_rnum-1]!='\n')goto serial1_begin;
	    seri1_rnum=MOBILE_BASE_ADDRESS;
	    goto serial1_end;
	 }	

serial1_begin:
  	 switch(seri1_rmode)
     {
       case 0:
           if(r_msg==0)
           {
		  	   if(seri1_rnum>=(MOBILE_BASE_ADDRESS+5))
			   {
				  if(XBYTE[seri1_rnum-5]!='+') goto serial1_end;
				  if(XBYTE[seri1_rnum-4]!='C') goto serial1_end;
				  if(XBYTE[seri1_rnum-3]!='M') goto serial1_end;
				  if(XBYTE[seri1_rnum-2]!='T') goto serial1_end;
				  if(XBYTE[seri1_rnum-1]!=':') goto serial1_end;
				  MOBILELED=0;
				  crlf_number=0;
			 	  do{
				     while(RI_1==0);
			         RI_1=0;
					 if(seri1_rnum>=MAX_SRAM_ADDRESS){seri1_rnum=MOBILE_BASE_ADDRESS;goto serial1_end;}
		             XBYTE[seri1_rnum]=SBUF1;
		             seri1_rnum++;
					 if(XBYTE[seri1_rnum-2]!='\r')continue;
					 if(XBYTE[seri1_rnum-1]!='\n')continue;
				     crlf_number++;
			 	    }while(crlf_number<2);
 			      r_msg=1;
			      seri1_rnum=MOBILE_BASE_ADDRESS;
  	              MOBILELED=1;
			   }
		   }
       break;
 
  	   case 1:
	  	   if(seri1_rend)
	  	   {
		  	   if(seri1_rnum>=(MOBILE_BASE_ADDRESS+2))
			   {
				  if(XBYTE[seri1_rnum-2]!='O') goto serial1_end;
				  if(XBYTE[seri1_rnum-1]!='K') goto serial1_end;
				  MOBILELED=0;
			 	  do{
				     while(RI_1==0);
			         RI_1=0;
					 if(seri1_rnum>=MAX_SRAM_ADDRESS){seri1_rnum=MOBILE_BASE_ADDRESS;goto serial1_end;}
		             XBYTE[seri1_rnum]=SBUF1;
		             seri1_rnum++;
					 if(XBYTE[seri1_rnum-2]!='\r')continue;
					 if(XBYTE[seri1_rnum-1]!='\n')continue;
					 break;
			 	    }while(1);
			      seri1_rend=0;
			      seri1_rnum=MOBILE_BASE_ADDRESS;
  	              MOBILELED=1;
			   }
		   }   
	   break;
	   
	   case 2:
	  	   if(seri1_rend)
	  	   {
               MOBILELED=0;
		  	   if(seri1_rnum>=(MOBILE_BASE_ADDRESS+2))
			   {
				  if(XBYTE[seri1_rnum-2]!='>')  goto serial1_end;
				  if(XBYTE[seri1_rnum-1]!=SPACE)goto serial1_end;
				  seri1_rend=0;
				  seri1_rnum=MOBILE_BASE_ADDRESS;
  	              MOBILELED=1;
			   }
	  	   }  
	   break;   
	   
	   case 3:
	  	   if(seri1_rend)
	  	   {
  		       MOBILELED=0;
		  	   if(seri1_rnum>=(MOBILE_BASE_ADDRESS+2))
			   {
				  if(XBYTE[seri1_rnum-2]!='O') goto msgcancle1;
				  if(XBYTE[seri1_rnum-1]!='K') goto msgcancle1;
			 	  do{
				     while(RI_1==0);
			         RI_1=0;
					 if(seri1_rnum>=MAX_SRAM_ADDRESS){seri1_rnum=MOBILE_BASE_ADDRESS;goto serial1_end;}
		             XBYTE[seri1_rnum]=SBUF1;
		             seri1_rnum++;
					 if(XBYTE[seri1_rnum-2]!='\r')continue;
					 if(XBYTE[seri1_rnum-1]!='\n')continue;
					 break;
			 	    }while(1);
  	              msgready_flag=1;
  	              goto msgcancle2;
       msgcancle1:if(XBYTE[seri1_rnum-2]!='>')  goto serial1_end;
				  if(XBYTE[seri1_rnum-1]!=SPACE)goto serial1_end;
				  msgready_flag=0;
 	   msgcancle2:seri1_rend=0;
				  seri1_rnum=MOBILE_BASE_ADDRESS;
  	              MOBILELED=1;
			   }
		   }   
	   break;
     } 
serial1_end:;
   }  
}

/**************************************************
定时器0中断
**************************************************/
void second_int(void) interrupt 1 using 3
{ 
  TH0=0x4b;
  TL0=0xfd;                /*timer0 is 50ms  at 11.0592MHZ*/ 
  time_1s++;
  if(time_1s>=delaytime)   /*delaytime=400:20s*/
  {
    time_1s=0;
    timeout=1;
  }  
}

void start(void)
{
  seri1_rmode=1;
  seri1_rend=0;                     
  r_msg=0;
  crlf_number=0;
  seri1_rnum=MOBILE_BASE_ADDRESS;   //指向GSM模块接收缓冲区(W77E58内部SRAM)基地址,
  seri0_rnum=USER_BASE_ADDRESS;     //指向用户接收缓冲区(W77E58内部SRAM)基地址,
  user_command=0;
}	

main()
{
  USERLED=0;
  msec(20000);
  start();
  init_w77e58();
  init_interrupt();

  while(init_Mobile());
  USERLED=1;

  do{
      dog();
      POWERLED=0;  	
      seri1_rmode=0;
      if(r_msg)
	  {
	    USERLED=0;
	    if(sendmsg_touser()){;}
	    r_msg=0;
	    USERLED=1;
	  }  
      
      if(user_command)
      {
           USERLED=0;
           if(sendmsg())senderr_touser();
           else         sendok_touser();
           user_command=0;
           USERLED=1;
      }
    
    }while(1);

}	

⌨️ 快捷键说明

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