1. 程式人生 > >利用gsm模組自動收發簡訊

利用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;

}