利用gsm模块自动收发短信

嵌入式--利用gsm模块自动收发短信

效果:用户发送短信至由gsm模块构成的收发短信小系统,系统将自动回复短信,比如:Hello,you can send number 1,2 or 3 to chose different function.   然后用户可回复12,或3,系统将会根据短信内容回复不同的短信。

 

说明:在此只讲授基本关键步骤,不对代码进行详细讲解,但保证初学者能实现上述效果,并明白基本原理。

 

实现思路:首先拿到Gsm模块后,要知道它到底是个什么东西,怎么去使用它,然后怎么用程序来实现上述效果。

1. 什么是GSM

GSMGlobal System for Mobile Communication),被看作是第二代 (2G)移动电话系统。大家对3G4G应该并不陌生,这里也就很容易理解GSM是什么了。

2. GSM模块如何使用?

GSM模块如下图一所示,主要关注它的那个接口,称为串口,我们要经过串口来控制它,控制它如何动作(发短信,读短信,打电话等)的指令称为AT指令。实现发短信的简单实例是这样的:插入移动的电话卡,将模块通过串口与电脑连接,通过串口助手与之建立通信,在串口助手中发送相应的AT指令即可控制模块发送短信。

  对AT指令的简单讲解:

1. 发送短信:

第一步:

AT+CMGS=发送的电话号(如:18900988455) <Enter>

第二步:

  输入内容(如:Hello) <Enter>

 第三步:

 发送十六进制数:1A <Enter> (1A是发送指令)

 

说明:发送短信的前两步发送的均为字符。每一步之后均有一个回车,表示指令的结束。整个过程很清楚,首先指定手机号,然后输入发送内容,最后加上发送指令即可。

2.接收短信

第一步:

在串口助手里,当模块接到短信时,窗口会自动跳出短信的存储地址信息。

如:+cmti: "SM",3  这里的3说明短信存在3这个地址里,如果要读取短信,就必须知道这个地址。

第二步:

指定短信地址并读取信息。

指令:AT+CMGR=地址(如3)〈Enter〉

短信内容会在串口助手里显示,并附带有发送方的手机号,以及时间信息。

 

 

说明:我们这里仅在串口助手里实现了短信的收发,但最终要实现自动收发需要编程实现。我们之前已经学习过ARM的串口通信,只要在串口的程序里稍加修改,即可完成相应的任务。

 

 

3.程序实现:

板子的COM0与电脑通信,电脑控制板子动作。板子的COM3与GSM模块连接。这里我们给出主程序,相应的串口设置主程序不再给出。程序在在最后。

 

4.遇到的主要问题:1.如何获取GSM模块的回送信息。用read()函数,但是在发送完指令后不能立即读取回送信息,需要一定的延迟操作,否则只能读到八位的数据。  2.如何获取特定信息,比如短信存储地址,发送方手机程序,用字符串的剪切等操作即可。 3.发送信息时出现乱码。如果不指定发送的长度而是指定一个比发送内容长度长的数,那么将出现乱码。指定长度用Strlen()函数。

 

 

/* 主函数   

编写日期:2014-11-3

编写人员:李灏为,吴杰,汪浩然

*/

int main(void)

{

int fd;

int nread=0,n2write,nwrite1,i,flag=1,j=3;

char buff[]="AT+CMGR= \n";

char buff0[]="AT+CMGS=           \n";

   char buff1[]="Hello,I am a micro message system created by Lihaowei,Wujie,and Wanghaoran.  You can send messages to me,only limited to    1,2,or3.\n";

char del[]="at+cmgd=1,4\n";

int NUM=0X1A;

int* send=#

char buff3[100]={};

   char buff4[100]={};

   char buff5[100]={};

   char buff6[100]={};

char buff7[100]={};

char buff_number1[]="haha,you have chose the number 1\n";

char buff_number2[]="haha,you have chose the number 2\n";

char buff_number3[]="haha,you have chose the number 3\n";

char buffclean[]="AT+ORGL\n";

//打开串口,设置串口参数

if((fd=open_port(fd,3))<0)

{

perror("open_port error");

return;

}

if((i=set_opt(fd,9600,8,'N',1))<0)

{

         perror("set_opt error");

return;

}

printf("fd=%d\n",fd);

if(delete==1)

write(fd,del,20);

 

//等待接收短信,接收短信后获取短信存储地址,跳出等待循环

while(flag)

{

 

        

        if(j==3)

{

nread=read(fd,buff3,50);

 

if(nread>0)

{

printf("buff3[]=%d,%s\n",nread,buff3);

j--;

}

}

 

if(j==2)

{

         nread=read(fd,buff4,50);

if(nread>0)

{

printf("buff4[]=%d,%s\n",nread,buff4);

j--;

}

}

if(j==1)

{

    

flag=0;

printf("xx=%c\n",buff4[6]);

        

}

  

}

 

buff[8]=buff4[6];//将短信存储地址传送到buff[]中,构成完整读取短信AT指令

 

 

 

//以下是读取短信内容,获得手机号码

 

nwrite1=write(fd,buff,50);

sleep(1);

strcpy(buff,"Hello,  ");

 

j=3;

while(j)

{

 

nread=read(fd,buff6,60);

    sleep(1);

if(nread>0) 

{

printf("buff6[]=%d,%s\n",nread,buff6);

        }

j--;

}

 

 

for(j=0;j<11;j++)

{

buff0[8+j]=buff6[17+j];

buff7[j]=buff6[17+j];

//将手机号码传入buff0[] ,构成完整短信发送所需的号码AT指令

}

printf("buff0=%s\n",buff0);

printf("buff6[55]=%c\n",buff6[55]);

 

 

 

 

//以下是分析短信内容,根据内容发送不同的短信

 

if(buff6[55]=='1')

{

write(fd,buff0,strlen(buff0));

sleep(1);

 

write(fd,buff_number1,strlen(buff_number1));

sleep(1);

 

n2write=write(fd,send,2);

 

if(n2write>0) 

printf("Send success!\n");

 

}

 

 

if(buff6[55]=='2')

{

write(fd,buff0,strlen(buff0));

sleep(1);

 

write(fd,buff_number2,strlen(buff_number2));

sleep(1);

 

n2write=write(fd,send,2);

 

if(n2write>0) 

printf("Send success!\n");

 

}

 

 

if(buff6[55]=='3')

{

write(fd,buff0,strlen(buff0));

sleep(1);

 

write(fd,buff_number3,strlen(buff_number3));

sleep(1);

n2write=write(fd,send,2);

 

if(n2write>0) 

printf("Send success!\n");

 

 

 

}

 

else

{

     printf("buff1=%s\n",buff1);

    

     write(fd,buff0,strlen(buff0));

sleep(1);

     

write(fd,buff1,strlen(buff1));

sleep(1);

   

n2write=write(fd,send,2);

 

if(n2write>0) 

printf("Send success!\n");

 

 

}

 

close(fd);

return;

 

}

  • 11
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值