📄 at.c
字号:
#include "define.h"
#include "at.h"
//====================================================
char str[400]; //临时接受存储区
bool sim_need_init=1;
char system_ok; //1表示正常,0表示出错
//====================================================
char at_ok(void);
char sim_ok(void);
char csq_ok(void);
char at_init(void);
flash char mission_ok[]="Mission completed.%c"; //字幕机返回值为0x60
flash char mission_error[]="Message didn't displayed.%c"; //字幕机返回值不为0x60
flash char command_error[]="Message Error.%c"; //指令错误,或短信过长
//====================================================
char cmgs_ok(void){
bool flag=0;
printf("at+cmgf=1\r"); //text模式
if (gets_OK(str,30))
{
printf("at+cmgs=%c%s%c\r",'"',msg.TPA,'"');
if (gets_dayu())
{
printf(msg.TR_TP_UD,0x1A);
flag=1;
}
}
delay_ms(10000);
printf("at+cmgf=0\r"); //pdu模式
if (!gets_OK(str,30))
{
sim_need_init=1;
}
return flag;
}
char at_ok(void){
char i;
for (i=0;i<3;i++)
{
printf("at\r");
if (gets_OK(str,20)) return 1;
delay_ms(600);
}
//可以选择触发复位线,硬件重启gsm模块
if (!get_bit(system_ok,COM0))
{
PO_GSM_RST = 1; //启动gsm模块
delay_ms(250);
PO_GSM_RST = 0;
delay_ms(1000);
}
return 0;
}
char sim_ok(void){
bool temp = 1;
printf("at+csca?\r");
if (gets_OK(str,60)<40) temp = 0;
return temp;
}
char csq_ok(void){
bool flag=1;
char* p;
printf("at+csq\r");
if (!gets_OK(str,40)) flag=0;
else
{
p=strstrf(str,"+CSQ: ");
if (!p) flag=0;
else if ((*(p+6)=='9')&&(*(p+7)=='9')) flag=0;
}
return flag;
}
char cmgd_ok(unsigned char index){
bool flag=1;
if (index>99) index=1;
printf("at+cmgd=%c%c\r",index/10+'0',index%10+'0');
if (!gets_OK(str,30)) flag=0;
delay_ms(200);
return flag;
}
char cmgl_ok(void){ //有无新短信
bool flag=0;
printf("at+cmgl=0\r"); //0,未读短信.
if (gets_OK(str,400)) flag = 1;
return flag;
}
char at_init(void){
bool flag=1;
printf("at+cscs=%cgsm%c\r",'"','"'); //gsm模式
if (!gets_OK(str,30)) flag=0;
printf("at+cmgf=0\r"); //pdu模式
if (!gets_OK(str,30)) flag=0;
printf("at+csms=0\r"); //可接受、发送短信
if (!gets_OK(str,40)) flag=0;
printf("at+cscb=1\r"); //不接受广播短信
if (!gets_OK(str,30)) flag=0;
printf("at+cpms=%csm%c,%csm%c,%csm%c\r",'"','"','"','"','"','"'); //短信存储空间为SIM卡
if (!gets_OK(str,70)) flag=0;
if (!del_ok()) flag=0; //判断SIM卡剩余空间
printf("at+cnmi=0,0,0,0,1\r"); //新短信到达不提示
if (!gets_OK(str,40)) flag=0;
return flag;
}
char del_ok(void){
bool flag=1;
char *p;
unsigned char used,total,temp;
printf("at+cpms?\r"); //查询剩余空间
if (!gets_OK(str,70)) flag=0;
else
{
p=strchr(str,','); //完成used和total字符串的提取
if (!p) flag=0;
else
{
p++;
used=(*(p++)-'0'); //统计已使用的数
for (;(*p<='9')&&(*p>='0');p++)
{
used*=10;
used+=(*p-'0');
}
if (*p!=',') flag=0;
else
{
p++;
total=(*(p++)-'0'); //统计已使用的数
for (;(*p<='9')&&(*p>='0');p++)
{
total*=10;
total+=(*p-'0');
}
if (*p!=',') flag=0;
}
}
}
if (flag)
{
if (used>total) flag=0;
else if (total-used<5) //比较
{
if (total>50) total=50;
for (temp=1;temp<total;temp++) //全部删除
cmgd_ok(temp);
}
}
return flag;
}
void gsm_test(void){
if (at_ok()) //com0通讯正常
{
set_bit(system_ok,COM0);
if (sim_ok()) //有sim卡
{
set_bit(system_ok,SIM);
if (sim_need_init) //sim卡需要初始化
{
if (at_init())
{
sim_need_init=0; //sim卡初始化成功
set_bit(system_ok,GSM_INIT);
}
else clr_bit(system_ok,GSM_INIT); //sim卡初始化失败
}
}
else //无sim卡
{
clr_bit(system_ok,SIM);
sim_need_init=1;
}
if (!csq_ok()) //测信号强度
{
clr_bit(system_ok,SIGNAL);
}
else
{
set_bit(system_ok,SIGNAL);
}
}
else //com0通讯出错
{
clr_bit(system_ok,COM0);
set_bit(system_ok,SIM); //显示通讯出错时,不显示无SIM卡提示
sim_need_init=1;
}}
unsigned char get_msg_num(void){
unsigned char msg_num=0;
char* p=str;
if (!cmgl_ok()) //短信过长,缓冲区溢出了
{
return 0xFF;
}
for (;p;msg_num++)
{
p+=7;
p=strstrf(p,"+CMGL: ");
}
msg_num--;
return msg_num;
}
char* read_msg(void){
char *p;
p=strstrf(str,"+CMGL: ");
if (p)
{
p+=7;
msg.index = *(p++)-'0'; //仅支持2位
if ((*p>='0')&&(*p<='9'))
{
msg.index *= 10;
msg.index += (*p-'0');
}
p=strstrf(str,"\r\n");
if (p)
{
p+=2;
p = gsmDecodePdu(p);
if (p)
{
if (strcmpf(p,"\r\n\r\nOK\r\n")) p=0; //转换失败
}
}
}
return p;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -