📄 gsm-at.c
字号:
/****************************************************************
****************************************************************
**** gsm-at.c 串口接收发送 *****
**** *****
**** 本程序都是采用PDU格式 *****
****************************************************************
****************************************************************/
#include <at89x52.h>
#include <string.h>
#include <delayms.h>
#include <at24c02.h>
#include <lcd.h> //test
#define uchar unsigned char
#define uint unsigned int
#define RsBuf_N 100
bit Do_command(uchar n_do); //执行控制命令
bit Chk_Read_Do();//检测读取新短信执行控制命令
extern uchar idata phonenum[15];//存放要发送对象的号码
extern void test_code(uchar n_delay,uchar n_wait);/*测试函数*/
extern uchar sec_sign;//警报标志位
extern uchar send_Msg_sign1;//发送短信标志位 红外
extern uchar send_Msg_sign2;//发送短信标志位 燃气
extern uchar send_Msg_sign3;//发送短信标志位 烟雾
//test_code(,);/*测试函数*/
//串口函数声明
extern bit scan_Security();//安全监控扫描
uchar InStrLoc ; //存放接收到的数据在InStr中的位置
uchar idata A_string[RsBuf_N]; //总字符串
//---***----***-----***
uchar Nindex[]={'1'-48,'2'-48,'3'-48,'4'-48}; //存放发送到SIM卡中短信返回的index
uchar idata Rev_pho[15]; //存放来信中提取的号码
char Rev_index; //存放来信的index号
//---***----***-----***
//***********************字符串查找******************************
//*功 能: 查找字符串
//*形 参: char *s, char *t ;在s中查找t
//*返 回 值: s_temp(t在s中的位置)成功 0 失败
//*备 注:
//***************************************************************
char *StrFind(char *s, char *t){
char *s_temp; //s_temp指向s
char *m_temp; //the mv_tmp used to move in the loop
char *t_temp; //point to the pattern string
if (NULL == s || NULL == t) return NULL;
//s_temp point to the s string
for (s_temp = s; *s_temp != '\0'; s_temp++){
//the move_tmp used for pattern loop
m_temp = s_temp;
//the pattern string loop from head every time
for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++);
//if at the tail of the pattern string return s_tmp
if (*t_temp == '\0') return s_temp;
}
return NULL;
}
//*********************** 串口发送一个字符 *********************
//*功 能: 通过串口发送一个字符
//**************************************************************
void putc(uchar ch)
{
ES = 0;//关串口中断
SBUF = ch;//送数据
while(!TI);//送完?
TI = 0;//清标志位
ES = 1;//开中断
}
//************************ 串口发送字符串 **********************
//*功 能: 通过串口发送字符串
//**************************************************************
void putnstr(uchar *str)
{
while (*str != '\0')
{
putc(*str);
str++;
}
}
//************************** 察除缓冲区 ************************
//*功 能: 清除缓冲区A_string
//**************************************************************
void ClrBuf(){
uchar i;
for(i=0;i<RsBuf_N;i++)
A_string[i]='\0';
InStrLoc = 0;
}
//********************* 检测缓冲区是否有效 *********************
//*功 能: 检测缓冲区中的OK和ERROR指令
//*返 回:OK,则返回1;ERROR,返回0
//**************************************************************
bit wait_ok()
{
ClrBuf();
while(StrFind(A_string,"OK") == NULL)
{
if(StrFind(A_string,"ERROR"))
return 0;
}
return 1;
}
//***********************发送联机指令******************************
//*功 能: 串口发送数组命令"AT",
//*形 参:
//*返 回 值:
//*备 注: 测试GSM模块是否连接正确
//*****************************************************************
bit connect_gsm(void)
{
//等待应答"OK"
ClrBuf();
putnstr("AT\r");
delayms_100ms();
if(StrFind(A_string,"OK") == NULL)
return 0;
else
return 1;
}
//*********************** 获取网络注册情况 ***********************
//*返 回 值: 成功返回1,失败返回0
//*备 注:
//****************************************************************
bit connect_gsmnet()
{
ClrBuf();
putnstr("AT+CREG?\r");
delayms_100ms();
if(StrFind(A_string, "+CREG: 0,1") != NULL || StrFind(A_string, "+CREG: 0,5") != NULL)
return 1;
else
return 0;
}
//************************ 初始化设置GSM ***********************
//*功 能: 禁止回显,设置为pdu模式
//**************************************************************
void init_gsm()
{
//串口发送"禁止回显"指令
putnstr("ATE0\r");
wait_ok();
putnstr("AT+CMGF=0\r");//pdu模式
wait_ok();
}
//************************ 初始化设置SIM ***********************
//*功 能: AT+CSCB=1 不接受广播短信
//**************************************************************
void init_sim()
{
putnstr("AT+CSCB=1\r"); //不接受广播短信
wait_ok();
}
//************************* 串口初始化 *************************
//*功 能: 设置波特率9600,开串口中断,清除接收缓冲区
//**************************************************************
void init_uart(void)
{
TMOD|=0x20; //
PCON = 0x00; //波特率不加培
TH1=0xfd;
TL1=0xfd; //波特率为9600
SCON=0X50; //工作方式1,开串口接收
IE |= 0x90; //开串口中断
PS=1;
TR1=1;
EA = 1;
ClrBuf();
}
//************************* 数字转ASCII ************************
//*功 能: 把数字转化为ASCII码值发送到串口
//**************************************************************
void NumIn(uchar i)
{
//数字小于10
if(i>=0&&i<=9)
{
putc(i+48);
}
//数字小于100
else if(i<=99)
{
putc(i/10+48);
putc(i%10+48);
}
//数字大于100
else
{
putc(i/100+48);
putc(i%100/10+48);
putc(i%10+48);
}
}
//************************* 删除短信息 *************************
//*功 能: AT+CMGD 删除第index条短信
//*返 回 值: 若index为0则返回0,成功则直接返回
//**************************************************************
bit EraseMsg(uchar index)
{
putnstr("AT+CMGD="); //向tc35i发送删除指令"AT+CMGD="
if(!index)
return 0;
NumIn(index); //如果index不为0输入index
putc('\r'); //向tc35i发送回车指令
wait_ok();
}
//********************** 删除SIM所有短信息 *********************
//*功 能: 删除SIM中所有的信息
//*返 回 值: 失败返回0,成功返回1
//**************************************************************
bit EraseMsg_All(void)
{
uchar n_tmp,i;
char *tmp;
ClrBuf(); //擦除缓存
putnstr("AT+CPMS?\r"); //查看SIM卡存储情况
while(wait_ok()==NULL); //判断发送是否成功
if( StrFind(A_string,"SM") )
{
tmp=StrFind(A_string,"SM")+6; //取出SIM卡中的信息容量
n_tmp=*tmp-48;
tmp++; //取出SIM卡中的信息容量
n_tmp=(*tmp-48)+n_tmp*10;//取两位数到n_tmp
LCD_write_char(n_tmp/10+48);//TEST
LCD_write_char(n_tmp%10+48);//TEST
}
for(i=1;i<=n_tmp;i++)
EraseMsg(i); //删除短信
test_code(3,1);//响铃300ms提示
return 1;
}
//************************ 判断信息已满 ************************
//*功 能: 若信息已满,则删除SIM中除预备发送的所有的信息
//*返 回 值: 失败返回0,成功返回1
//**************************************************************
bit Msg_Full(void)
{
uchar s_msg,all_msg,i;
char *S_msg_tmp; //SIM卡中已存的信息数
ClrBuf(); //擦除缓存
putnstr("AT+CPMS?\r"); //查看SIM卡存储情况
while(wait_ok()==NULL); //判断发送是否成功
if( StrFind(A_string,"SM") )
{
S_msg_tmp=StrFind(A_string,"SM")+4; //取出SIM卡中已存的信息数
s_msg=*S_msg_tmp-48;
S_msg_tmp++; //判断是否为两位数
if(*S_msg_tmp>='0' && *S_msg_tmp<='9')
{
s_msg=(*S_msg_tmp-48)+s_msg*10;//取两位数到n_tmp
// LCD_write_char(s_msg/10+48);//显示十位
// LCD_write_char(s_msg%10+48);//显示个位
S_msg_tmp++;
}
// else
// LCD_write_char(s_msg+48);//只有一位数时直接显示
S_msg_tmp++; //取出SIM卡中的信息容量 十位
all_msg=*S_msg_tmp-48;
S_msg_tmp++;
all_msg=(*S_msg_tmp-48)+all_msg*10;//取两位数到all_msg
// LCD_write_char(all_msg/10+48);//显示十位
// LCD_write_char(all_msg%10+48);//显示个位
if(s_msg < all_msg)
return 0;
LCD_clear();//清屏
LCD_write_String(0,2,"Message Full");
for(i=5;i<=all_msg;i++)
EraseMsg(i); //删除短信
test_code(1,1);//响铃100ms提示
return 1;
}
else
return 0;
}
//************************** 号码处理 **************************
//*功 能: 在手机号码(包括86)的末尾添加F,凑成偶数个,然后把
//* 整串号码的奇数位和偶数位相互交换,如0位和1位,2位
//* 和3位,以此类推
//**************************************************************
void del_pho(char *phonenum)
{
unsigned char i;
unsigned char tmp_ch;
phonenum[13]='F';
for(i=0;i<14 ;i+=2) //手机号码的奇数位与偶数位相交换
{
tmp_ch=phonenum[i];
phonenum[i]=phonenum[i+1];
phonenum[i+1]=tmp_ch;
}
phonenum[14]='\0';
// putnstr(phonenum);
}
//*********************** 发送短信的内容 ***********************
//*功 能: 选择要发送短信的内容(PDU)
//*返 回 值: 选择错误则返回0,选择成功则返回1
//*备 注:situation的可取值是1、2、3、4
//**************************************************************
uchar Send_sms_meat(uchar situation )
{
if(situation == '1' || situation == 1)
putnstr("0D5BB691CC4E0052076B635E38FF01"); //家里一切正常! (14)0x0D个
else if(situation == '2' || situation == 2)
putnstr("0A67094EBA884C7A83FF01"); //有人行窃! (10)0x0A个
else if(situation == '3' || situation == 3)
putnstr("1053A8623F670971C36C146CC46F0FFF01"); //厨房有燃气泄漏! (16)0x10个
else if(situation == '4' || situation == 4)
putnstr("105C4B51856709706B707E8B6660C5FF01"); //屋内有火灾警情! (16)0x10个
else
return 0;
return 1;
}
//*********************** 写短信到SIM卡 ************************
//*功 能: 把要发送出去的短信先发送短信到SIM卡
//*返 回 值: 失败则返回0,成功则返回1
//*备 注:situation的可取值是1、2、3、4
//**************************************************************
bit Send_sms_sim(uchar * phone, uchar situation)
{
char *tmp;
// uchar i,n_addr=0x0;
putnstr("AT+CMGW="); //用于存储一条消息在SIM卡的存储区中
//PDU短信的总长度
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -