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