📄 gsm-at.c
字号:
if(situation==1)
putnstr("29"); //14+14+1
else if(situation==2)
putnstr("25"); //14+10+1
else if(situation==3)
putnstr("31"); //14+16+1
else if(situation==4)
putnstr("31"); //14+16+1
putc('\r'); //回车
while(StrFind(A_string,">") == NULL)
{
if(StrFind(A_string,"ERROR"))
return 0;
}
putnstr("0011000D91"); //1100:固定的,0D:手机号码长度,+不算在内,十六进制表示,91:发送到手机为91
del_pho(phone); //补全手机号码到偶数位,将奇数位与偶数位相交换
putnstr(phonenum); //发送交换后的号码
putnstr("0008"); //4位,8bit方式
putnstr("00"); //2位,允许时间 A7
while( !Send_sms_meat(situation) ); //发送第situation条PDU短信内容到串口
putc('\x1a'); //<Ctrl>+<z>
putc('\r'); //回车
delayms_100ms();
if(wait_ok()) //判断发送是否成功
{
tmp=StrFind(A_string,": ")+2; //记录index在A_string中的位置
Nindex[situation-1]=*tmp-48; //记录刚发送到SIM卡中短信的index号
/* for(i=0,n_addr=0x0;i<4;i++)
{
I2C_On(I2C_SEND, 0x18, n_addr++, &Nindex[i], 1);//写Nindex短信序号到0x18+n_addr地址
delayms_10ms();
} */
Nindex[5] = '\0';
return 1;
}
else
return 0;
}
//************* 开机初始化将所有写短信到SIM卡 ******************
//*功 能: 开机初始化时,将所有要发送出去的短信写到SIM卡
//*返 回 值: 失败无返回,成功则返回1
//*备 注:调用该函数时,请在前面初始化相应函数,如:
//* init_uart(); //初始化串口
//* while(!connect_gsm()); //发送联机指令
//* init_gsm(); //禁止回显,设置为pdu模式
//* while(!connect_gsmnet()); //获取网络注册情况
//* init_sim(); //不接受广播短信
//*
//**************************************************************
bit init_Send_sms_sim(uchar * phone)
{
EraseMsg_All(); //删除所有短信
while( !Send_sms_sim(phone,1) );//写短信内容为:家里一切正常! 到SIM卡中的Nindex[1-1]
//LCD_write_char('1');//测试用
while( !Send_sms_sim(phone,2) );//写短信内容为:有人行窃! 到SIM卡中的Nindex[2-1]
//LCD_write_char('2');//测试用
while( !Send_sms_sim(phone,3) );//写短信内容为:厨房有燃气泄漏! 到SIM卡中的Nindex[3-1]
//LCD_write_char('3');//测试用
while( !Send_sms_sim(phone,4) );//写短信内容为:屋内有火灾警情! 到SIM卡中的Nindex[4-1]
//LCD_write_char('4');//测试用
return 1;
}
//**************** 从SIM卡中发送第index条短信 ******************
//*功 能: 从SIM卡中发送第index条短信,注:SIM卡中一定要存有信息
//*返 回 值: 失败则返回0,成功则返回1
//*备 注:index的可取值是1、2、3、4
//**************************************************************
bit Send_message(uchar index)
{
// LCD_clear();//清屏
// LCD_write_String(0,0,"Sending message");
LCD_write_char('S');
putnstr("AT+CMSS=");
// putc(index);
NumIn(index);
LCD_write_char(Nindex[index]+48);
putc('\r');
delayms_1000ms();
if(wait_ok())
{
//LCD_write_String(2,2,"OK!");
LCD_write_char('Y');
return 1;
}
else
{
//LCD_write_String(2,2,"ERROR!");
LCD_write_char('N');
return 0;
}
}
//************************ 检测新短信 **************************
//*功 能: 检测是否有新的短信,有则记录其index号到Rev_index
//*返 回 值: 失败则返回0,成功返回1
//*备 注:
//**************************************************************
bit Rev_message()
{
char *tmp;
// test_code(1,5);//测试用
putnstr("AT+CMGL=0\r");//列出未读取的信息
if(wait_ok())
{
if(StrFind(A_string,"+CMGL")==NULL)
return 0;
else
{
tmp = StrFind(A_string,"+CMGL")+7;//获取新短信的index号
Rev_index = *tmp-48;
tmp++;
if(*tmp>=48 && *tmp<=57)
{
Rev_index =Rev_index*10+(*tmp-48);
LCD_write_char(Rev_index/10+48);//显示十位
LCD_write_char(Rev_index%10+48);//显示个位
}
else
LCD_write_char(Rev_index+48);//只有一位数时直接显示
return 1;
}
}
}
//********************** 提取来信的号码 ************************
//*功 能: 在缓冲区中提取来信的号码,前提是已经把短信内容读取到
//* :缓冲区中。即执行了at+cmgr=1
//*返 回 值: 返回信息内容长度的地址
//*备 注:
//**************************************************************
bit Rev_message_pho(void)
{
char *tmp;
uchar i;
tmp=StrFind(A_string,"0891");
tmp += 23; //把指针指向来信的号码开始位置
for(i=0;i<15;i++) //把来信的号码提取到Rev_pho中
{
Rev_pho[i] = A_string[*tmp++];
}
tmp = tmp+2+2+14;//tmp指向来信号码的下一个位置,2表示普通GSM,点到点方式
//2表示编码方式(UCS2编码);14表示年月日时分秒和时区,每个
return *tmp; //占两位。此时tmp指向内容的长度的第一个字符
}
//********************** 检测来信的内容 ************************
//*功 能: 在缓冲区中检测来信的内容,查看其是否为有效的控制命令
//*返 回 值: 返回控制指令要执行命令的序号(2 红外,3 燃气,4 烟雾)。
//* : 失败返回0
//*备 注:有效的控制命令短信内容:
//* : 1、家里情况 2、关闭红外 3、关闭烟雾
//* : 4、关闭燃气 5、关闭所有
//**************************************************************
bit Rev_message_meat()
{
LCD_clear();//清屏
if( StrFind(A_string,"5BB691CC60C551B5")!=NULL )//1、家里情况 "5BB691CC60C551B5"
{
LCD_write_char('1');
Do_command(1);
test_code(3,0);//响铃300ms提示
return 1;
}
else if( StrFind(A_string,"517395ED7EA25916")!=NULL )//2、关闭红外 "517395ED7EA25916"
{
LCD_write_char('2');
Do_command(2);
// test_code(3,1);test_code(3,0);//连续两次响铃300ms提示,中间停顿100ms
return 1;
}
else if( StrFind(A_string,"517395ED70DF96FE")!=NULL )//3、关闭烟雾 "517395ED70DF96FE"
{
LCD_write_char('3');
Do_command(3);
// test_code(3,1);test_code(3,1);test_code(3,0);//连续三次响铃300ms提示,中间停顿100ms
return 1;
}
else if( StrFind(A_string,"517395ED71C36C14")!=NULL )//4、关闭燃气 "517395ED71C36C14"
{
LCD_write_char('4');
Do_command(4);
//连续四次响铃300ms提示,中间停顿100ms
// test_code(3,1);test_code(3,1);test_code(3,1);test_code(3,0);
return 1;
}
else if( StrFind(A_string,"517395ED62406709")!=NULL )//5、关闭所有 "517395ED62406709"
{
LCD_write_char('5');
Do_command(5);
test_code(10,0);//响铃1S提示
return 1;
}
else
{
LCD_write_char('0');
test_code(1,0);//响铃100ms提示
return 0; //非有效控制指令,返回0
}
}
//********************** 执行控制命令 **************************
//*功 能: 执行控制操作
//*返 回 值: 失败返回0
//*备 注:
//**************************************************************
bit Do_command(uchar n_do)
{
if(n_do == 1) //1、家里情况
{
if( !scan_Security())//没有安全隐患发生
{
P0_7 = 0;//开指示灯4 表示安全
P0_3 = 1;//关蜂鸣器
sec_sign=0;//关警报标志位
Send_message(Nindex[0]);//发送短信:家里一切正常!
}
}
else if(n_do == 2)//2、关闭红外
{
P0_4 = 1;//关指示灯1
if(send_Msg_sign2 !=0 && send_Msg_sign3 != 0)
{
P0_3 = 1;//关蜂鸣器
sec_sign=0;//关警报标志位
}
LCD_clear();//清屏
disp16_16(0,0,39);//关
disp16_16(2,0,40);//闭
disp16_16(4,0,4);//红
disp16_16(6,0,5);//外
delayms_1000ms();
}
else if(n_do == 3)//3、关闭烟雾
{
P0_5 = 1;//关指示灯2
if(send_Msg_sign1 !=0 && send_Msg_sign2 != 0)
{
P0_3 = 1;//关蜂鸣器
sec_sign=0;//关警报标志位
}
LCD_clear();//清屏
disp16_16(0,0,39);//关
disp16_16(2,0,40);//闭
disp16_16(4,0,6);//烟
disp16_16(6,0,7);//雾
delayms_1000ms();
}
else if(n_do == 4)//4、关闭燃气
{
P0_6 = 1;//关指示灯3
if(send_Msg_sign1 !=0 && send_Msg_sign3 != 0)
{
P0_3 = 1;//关蜂鸣器
sec_sign=0;//关警报标志位
}
LCD_clear();//清屏
disp16_16(0,0,39);//关
disp16_16(2,0,40);//闭
disp16_16(4,0,8);//燃
disp16_16(6,0,9);//气
delayms_1000ms();
}
else if(n_do == 5)//5、关闭所有
{
P0_4 = 1;//关指示灯1
P0_5 = 1;//关指示灯2
P0_6 = 1;//关指示灯3
P0_7 = 0;//开指示灯4 表示安全
P0_3 = 1;//关蜂鸣器
sec_sign=0;//关警报标志位
LCD_clear();//清屏
disp16_16(0,0,39);//关
disp16_16(2,0,40);//闭
disp16_16(4,0,41);//所
disp16_16(6,0,42);//有
delayms_1000ms();
}
else
return 0;
}
//*************** 检测读取新短信执行控制命令 *******************
//*功 能: 读取新的信息,取出其来信人,并检测短信内容是否有关键
//* :的控制命令
//*返 回 值: 失败返回0,成功返回1
//*备 注:只有设定的目标号码发送的指令才有效
//**************************************************************
bit Chk_Read_Do()
{
ClrBuf();
if( Rev_message() ) //有新的信息到来
{
while(!connect_gsm()); //发送联机指令
ClrBuf();
LCD_clear();//清屏
disp16_16(0,1,0);//收
disp16_16(2,1,1);//到
disp16_16(4,1,2);//短
disp16_16(6,1,3);//信
putnstr("AT+cmgr="); //读取Rev_index号的新信息
//putnstr(Rev_index);
NumIn(Rev_index);
putc('\r');
delayms_100ms();
if(wait_ok()) //成功将短信内容读取到缓冲区
{
Rev_message_pho(); //提取来信的号码
// LCD_write_char('E');//测试用
del_pho(phonenum); //补全手机号码到偶数位,将奇数位与偶数位相交换
//if(strcmp(Rev_pho,phonenum)==0)//判断是否为指定目标的号码
Rev_message_meat();//检测来信的内容
scan_Security();//安全监控扫描
}
Msg_Full();//判断信息是否已满
return 1;
}
else
return 0;
}
//************************ 串口中断接收 ************************
//*功 能: 接收字符串。A_string为接收缓冲区,InStrLoc接收计数
//*返 回 值: 无返回值
//**************************************************************
void uart_interrupt() interrupt 4
{
if(RI && InStrLoc<RsBuf_N)
{
RI = 0;
A_string[InStrLoc] = SBUF;
InStrLoc++;
A_string[InStrLoc] = 0;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -