概述
嵌入式--利用gsm模块自动收发短信
效果:用户发送短信至由gsm模块构成的收发短信小系统,系统将自动回复短信,比如:Hello,you can send number 1,2 or 3 to chose different function. 然后用户可回复1,2,或3,系统将会根据短信内容回复不同的短信。
说明:在此只讲授基本关键步骤,不对代码进行详细讲解,但保证初学者能实现上述效果,并明白基本原理。
实现思路:首先拿到Gsm模块后,要知道它到底是个什么东西,怎么去使用它,然后怎么用程序来实现上述效果。
1. 什么是GSM?
GSM(Global System for Mobile Communication),被看作是第二代 (2G)移动电话系统。大家对3G,4G应该并不陌生,这里也就很容易理解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,4n";
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 1n";
char buff_number2[]="haha,you have chose the number 2n";
char buff_number3[]="haha,you have chose the number 3n";
char buffclean[]="AT+ORGLn";
//打开串口,设置串口参数
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=%dn",fd);
if(delete==1)
write(fd,del,20);
//等待接收短信,接收短信后获取短信存储地址,跳出等待循环
while(flag)
{
if(j==3)
{
nread=read(fd,buff3,50);
if(nread>0)
{
printf("buff3[]=%d,%sn",nread,buff3);
j--;
}
}
if(j==2)
{
nread=read(fd,buff4,50);
if(nread>0)
{
printf("buff4[]=%d,%sn",nread,buff4);
j--;
}
}
if(j==1)
{
flag=0;
printf("xx=%cn",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,%sn",nread,buff6);
}
j--;
}
for(j=0;j<11;j++)
{
buff0[8+j]=buff6[17+j];
buff7[j]=buff6[17+j];
//将手机号码传入buff0[] ,构成完整短信发送所需的号码AT指令
}
printf("buff0=%sn",buff0);
printf("buff6[55]=%cn",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=%sn",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;
}
最后
以上就是温婉海燕为你收集整理的用gsm模块自动收发短信的全部内容,希望文章能够帮你解决用gsm模块自动收发短信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复