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

📄 sms.c

📁 用51单片机收发短消息的源程序,有祥细的注释说明.
💻 C
📖 第 1 页 / 共 2 页
字号:
    SBUF='=';delay(1);
    SBUF='1';delay(1);
    SBUF=',';delay(1);
    SBUF='\"';delay(1);
    // 新密码从INBUF中获取
    SBUF=inbuf[19];delay(1);
    SBUF=inbuf[20];delay(1);
    SBUF=inbuf[21];delay(1);
    SBUF=inbuf[22];delay(1);
    SBUF=inbuf[23];delay(1);
    SBUF=inbuf[24];delay(1);
    SBUF='\"';delay(1);
    SBUF=',';delay(1);
    SBUF='1';delay(1);
    SBUF='2';delay(1);
    SBUF='9';delay(1);
    SBUF=',';delay(1);
    SBUF='\"';delay(1);
    SBUF='P';delay(1);
    SBUF='A';delay(1);
    SBUF='S';delay(1);
    SBUF='S';delay(1);
    SBUF='\"';delay(1);
    SBUF = 0x0d;delay(2);

    type = 4;
    inbuf[25]=0;

}

// 修改短消息服务中心号码
// AT指令:AT+CSCA="+8613000000000"<CR>
void change_sca()
{
    SBUF='A';delay(1);
    SBUF='T';delay(1);
    SBUF='+';delay(1);
    SBUF='C';delay(1);
    SBUF='S';delay(1);
    SBUF='C';delay(1);
    SBUF='A';delay(1);
    SBUF='=';delay(1);
    SBUF='\"';delay(1);
    SBUF='+';delay(1);
    SBUF='8';delay(1);
    SBUF='6';delay(1);
    // 新的短消息服务中心号码从INBUF中获取
    SBUF=inbuf[19];delay(1);
    SBUF=inbuf[20];delay(1);
    SBUF=inbuf[21];delay(1);
    SBUF=inbuf[22];delay(1);
    SBUF=inbuf[23];delay(1);
    SBUF=inbuf[24];delay(1);
    SBUF=inbuf[25];delay(1);
    SBUF=inbuf[26];delay(1);
    SBUF=inbuf[27];delay(1);
    SBUF=inbuf[28];delay(1);
    SBUF=inbuf[29];delay(1);
    SBUF='\"';delay(1);
    SBUF = 0x0d;delay(2);

    type = 4;
    inbuf[30]=0;
}


// 处理短消息内容中的操作指令
// AA:修改SIM卡地址本1中的密码
// AB:修改短消息服务中心号码
void process_cmd()
{
    // AA:修改SIM卡地址本1中的密码
    if(inbuf[17] == 'A'
        && inbuf[18] == 'A')
    {
        change_pass(); 
    }else
    // AB:修改短消息服务中心号码
    if(inbuf[17] == 'A'
        && inbuf[18] == 'B')
    {
        change_sca(); 
    }
}

// 判断短消息内容是否合法
// 即内容的前6位为密码,核对其与地址本中保存的密码是否匹配
void is_legal_msg(void)
{
    unsigned char data k = 0;

    // 从sim卡地址本1的位置中读取密码,并放在BUFF缓冲区中
    // AT指令:AT+CPBR=1<CR>
    type = 7;     // 读取密码操作
    buffzero(buff, 0, BUFF_SIZE);
    
    // 忽略掉读取密码返回的前29字符,
    idx2 = -29;   
    
    SBUF='A';delay(1);
    SBUF='T';delay(1);
    SBUF='+';delay(1);
    SBUF='C';delay(1);
    SBUF='P';delay(1);
    SBUF='B';delay(1);
    SBUF='R';delay(1);
    SBUF='=';delay(1);
    SBUF='1';delay(1);
    SBUF = 0x0d;delay(1);

   ///////////////////////////////////////////////////////////////////////
   // 判断BUFF中的6位密码和INBUF中消息内容前6位密码是否相同
   // INBUF的内容为 手机号码+新消息内容
   
   // 手机号码有+86的情况下,INBUF第14为开始为消息内容
   if(buff[0] == inbuf[14]  // +86
      && buff[1] == inbuf[15]
      && buff[2] == inbuf[16]
      && buff[3] == inbuf[17]
      && buff[4] == inbuf[18]
      && buff[5] == inbuf[19]) 
    {
    	// 内容合法
   	// 处理消息内容中的操作指令
   	// AA 修改密码
   	// AB 修改短消息中新号码
        process_cmd();
        delay(2);

        // 合法后,给发送方返回一条短消息
        type = 4;
        buffzero(buff, 0, BUFF_SIZE);
        idx2 = 0;

        // 在BUFF中放置发送返回消息的AT指令的头
        // 要从INBUF中解析发送方的手机号码
        buff[idx2++]='A';
        buff[idx2++]='T';
        buff[idx2++]='+';
        buff[idx2++]='C';
        buff[idx2++]='M';
        buff[idx2++]='G';
        buff[idx2++]='S';
        buff[idx2++]='=';
        buff[idx2++]='\"';
        buff[idx2++]=/*'1'; /*/ inbuf[3];
        buff[idx2++]=/*'3'; /*/ inbuf[4];
        buff[idx2++]=/*'5'; /*/ inbuf[5];
        buff[idx2++]=/*'2'; /*/ inbuf[6];
        buff[idx2++]=/*'2'; /*/ inbuf[7];
        buff[idx2++]=/*'0'; /*/ inbuf[8];
        buff[idx2++]=/*'3'; /*/ inbuf[9];
        buff[idx2++]=/*'5'; /*/ inbuf[10];
        buff[idx2++]=/*'5'; /*/ inbuf[11];
        buff[idx2++]=/*'9'; /*/ inbuf[12];
        buff[idx2++]=/*'3'; /*/ inbuf[13];
        buff[idx2++]='\"';
        buff[idx2++]=0x0d;
        
    }
    // 手机号码无+86的情况下,INBUF第11为开始为消息内容    
    else if(buff[0] == inbuf[11]  // 无+86
      && buff[1] == inbuf[12]
      && buff[2] == inbuf[13]
      && buff[3] == inbuf[14]
      && buff[4] == inbuf[15]
      && buff[5] == inbuf[16]
		  )
    {
    	// 内容合法
   	// 处理消息内容中的操作指令
   	// AA 修改密码
   	// AB 修改短消息中新号码    	
        process_cmd();
        delay(2);

        // 合法后,给发送方返回一条短消息
        type = 4;
        buffzero(buff, 0, BUFF_SIZE);
        idx2 = 0;

        // 在BUFF中放置发送返回消息的AT指令的头
        // 要从INBUF中解析发送方的手机号码
        buff[idx2++]='A';
        buff[idx2++]='T';
        buff[idx2++]='+';
        buff[idx2++]='C';
        buff[idx2++]='M';
        buff[idx2++]='G';
        buff[idx2++]='S';
        buff[idx2++]='=';
        buff[idx2++]='\"';
        buff[idx2++]=/*'1'; /*/ inbuf[0];
        buff[idx2++]=/*'3'; /*/ inbuf[1];
        buff[idx2++]=/*'5'; /*/ inbuf[2];
        buff[idx2++]=/*'2'; /*/ inbuf[3];
        buff[idx2++]=/*'2'; /*/ inbuf[4];
        buff[idx2++]=/*'0'; /*/ inbuf[5];
        buff[idx2++]=/*'3'; /*/ inbuf[6];
        buff[idx2++]=/*'5'; /*/ inbuf[7];
        buff[idx2++]=/*'5'; /*/ inbuf[8];
        buff[idx2++]=/*'9'; /*/ inbuf[9];
        buff[idx2++]=/*'3'; /*/ inbuf[10];
        buff[idx2++]='\"';
        buff[idx2++]=0x0d;        
    }
    else
    {
         buffzero(inbuf, 0, INBUFF_SIZE);
         idx = 0;
    }
    
}


// 处理新接收到的短消息
// 步骤:1> 从新到消息标记 +CMTI: "SM",1 中获取新消息的SIM卡中的位置
//       2> 从SIM卡中读取新消息的内容
//       3> 从SIM卡中删除已读的短消息
//       4> 判断消息内容是否合法(密码是否正确)
void process_recv_msg()
{
    unsigned char k = 0, i = 0;

    for(k=0;k<idx;k++)
    {    
       // 确认新到消息标记  "SM",1
       // 并从中得到新到消息在SIM卡中的位置
       if( inbuf[k++] == ' '
           && inbuf[k++] == '\"'
           && inbuf[k++] == 'S'
           && inbuf[k++] == 'M'
           && inbuf[k++] == '\"'
           && inbuf[k++] == ',')  // recved one new msg
       {
	   // DATA2变化:从新消息到来的标志(放在inbuf中)判断到了"SM"字符,
	   // 从而可以解析后跟的新消息在SIM卡中的存放位置       	
           date2 ++;

           i = inbuf[k++];   // 新消息在SIM卡中的存放位置
           read_msg(i);      // 从SIM卡中读取新到短消息 
           delete_msg(i);    // 读取新消息内容后,将其从SIM卡中删除
           is_legal_msg();   // 判断新消息内容是否合法
                             // 合法后,消息操作类型type=4,可在主循环中作其他操作
          
           break;
       }
    }
}

// 主函数
void main(void)
{
	unsigned char data k;
	unsigned char start = 0;

	delay(1);
    

       ///////////////////////////////////////////////////////
       // 初始化串口
       setup_t1();
       setup_ck();
       TR1=1;
       EA=1;
       ES=1;

       // 设置文本收发模式前,给设备充分的启动时间
       delay(3);

       // 设置为文本格式发送/接收短消息
       setcmgftxt();

       // delay
       delay(3);

       // 命令处理死循环
       while(1)
       {
         show();  // 在每次循环中刷新数码管显示,反映data1,data2,data3,data4的变化

         // delay
         delay(3);

         if(1 == send) // send=1 有新的短消息到达
         {
             delay(2); // 延迟,保证接收中断已经读完所有的新到消息标志
             process_recv_msg(); // 处理新到消息
             delay(2);

             // idx>0   如果消息内容不为空
             // 4==type 且消息内容是合法的
             // 则向发送消息的手机返回一个消息
             if(idx > 0 && 4 == type) // send msg
		     {
	                 date3 ++;    // DATA3变化:收到的新消息是合法消息
	
                         k = 0;
                         // 首先向串口输出发送短消息AT指令的头,如:AT+CMGS="13522035593"<CR>
		             while(1)
		             {
		                 if(k>BUFF_SIZE || buff[k] == 0)
		                      break;
		                 SBUF = buff[k++]; delay(1);
		             }
                     
                         // 返回的消息内容忽略掉对方的手机号码
			 if(1 == hasplus86)
			     start = 20;
			 else
			     start = 17;
			     
			 // 向串口输出发送短消息的内容    
	                 for(k=start;k<idx;k++)
	                 {
	                     if(k<INBUFF_SIZE && inbuf[k] != 0)
	                        // && ((inbuf[k]>='a' && inbuf[k]<='z') ||(inbuf[k]>='A' && inbuf[k]<='Z')||(inbuf[k]>='0' && inbuf[k]<='9')))
	                     {
	                          SBUF = inbuf[k]; delay(1);
	                     }
	                     else
	                        break;
	                 }
	                 
	                 // 发送短消息AT指令的结束符号 Ctrl+Z
	                 SBUF = 0x1a;
             }

             type = 0; // 消息操作类型改为空操作
             send = 0; // 将新到消息标志=0,准备接收下一条消息
         }

      	 delay(3);

	}
}


⌨️ 快捷键说明

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