利用gsm模組自動收發簡訊
嵌入式--利用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)
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;
}