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

📄 at.c

📁 GSM模块的AT指令代码~,了解如何使用AT指令控制GSM模块收发短信等。
💻 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 + -