feisky

云计算、虚拟化与Linux技术笔记
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

GPRS模块SIM300的使用

Posted on 2010-05-21 15:33  feisky  阅读(3130)  评论(1编辑  收藏  举报

GPRS模块使用的说明

使用GPRS首先需要打开串口,设置好串口的各项参数。

一、AT+CMGL 读取所有短信

A、读取所有的信息:

第一步:at+cmgf=1 如果返回ok则继续。

说明:AT+CMGF  SELECT SMS MESSAGE FORMAT

第二步:at+cmgl=”all”

成功返回OK否则ERROR

+CMGL: 1,"REC READ","+8613702936376",,"05/12/16,09:04:43+00"

test

OK

B、读取未读的信息

第一步:at+cmgf=1

如果返回ok则继续。

第二步:at+cmgl=” rec unread”

成功返回OK否则ERROR

C、读取已读的信息

第一步:at+cmgf=1

如果返回ok则继续。

第二步:at+cmgl=” rec read”

成功返回OK否则ERROR

AT+CMGL参数:

1) If text mode:

  "REC UNREAD"    Received unread messages (default)

  "REC READ"          Received read messages

  "STO UNSENT"     Stored unsent messages

  "STO SENT"           Stored sent messages

  "ALL"                      All messages

2) If PDU mode:

  0         Received unread messages (default)

  1         Received read messages

  2         Stored unsent messages

  3         Stored sent messages

  4         All messages

二、AT+CMGR Read SMS message

X存储区读短消息:

       第一步:at+cmgf=1 如果返回ok则继续。

       第二步:at+cmgl=x

三、AT+CMGD Delete SMS message

删除信息:

       第一步:at+cmgf=1

                     如果返回ok则继续。

       第二步:at+cmgd= 数字号

成功返回OK否则ERROR

四、AT+CSCA SMS service centre address(设置短信中心号码)

设置短信中心号码:

       第一步:at+cmgf=1

                     如果返回ok则继续。

       第二步:at+csca=”短信中心号码  (比如+8613800546500

                     成功返回OK否则ERROR

五、AT+CMGS Send SMS message (发送信息)

发送信息:

       第一步:at+cmgf=1

                     如果返回ok则继续。

       第二步:AT+CMGS=“+8613xxxxxxxxx”<回车>

>输入短消息。Crtl+Z结束并发送。

注:此只能发送英文与数字

六、查询

查询设备:

命令AT+CGMI<回车>

返回:SIEMENS

返回:OK

命令AT+CGMM<回车>

返回:MC35i

返回:OK

命令:AT+CMEE=1<回车>

返回:具体的错误代码

ATZ;E 回车 Echo OFF

ATZ;E1回车 Echo ON

AT+CREG?回车 回答x(X=2脱网,X=1注册,X=0状态不明)

AT+COPS?回车 表示SIM卡是否被网络接受

AT+COPS=?回车 显示所有可用的网络。

AT+CREG?回车(是否网络注册)

AT+CSQ     SIGNAL QUALITY REPORT

AT+IPR=2400 回车(改变RS232口的速率至2400bps)

AT&W 回车 (保存已改参数)

输入PIN码:AT+CPIN=“xxxx”

七、网络是否注册(AT+CREG?

命令at+cmgf=1

返回:at+cmgf=1 返回:OK

 

命令AT+CREG?

返回:AT+CREG?   返回:+CREG: 0,1

注:( 2脱网, 1注册, 0状态不明)

返回:OK

 

八、SIM卡是否被网络接受(AT+COPS?)

命令at+cmgf=1

返回:at+cmgf=1

返回:OK

 

命令at+cops?

 

返回:+COPS: 0,0,"China Mobile"

 

返回:OK

 

九、显示所有可用的网络(AT+COPS=?)

命令at+cmgf=1

返回:at+cmgf=1

返回:OK

命令:at+cops=?

返回:+COPS: (2,"China Mobile",,"46000"),(3,"China Unicom",,"46001"),,(0-4),(0,2)

返回:OK

十、打电话

Demonstration              Syntax                  Expect Result

Make a voice call   ATD6241xxxx;      OK  MS makes a voice call

Hang up a call        ATH                            OK  Call dropped

 

 

 

问题解决

采用sim300发送短信时采用下面的格式

AT+CMGF=1  设置文本格式

AT+CMGS=”13245678912”   注意这块一定要加上双引号。否则返回ERROR

另外如果发送不出去,有可能是短信中心号码设置的不正确。

完整的程序

// this is a test about GPRS

 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

#include <fcntl.h> // open() close()

#include <unistd.h>      // read() write()

 

#include <termios.h>    // set baud rate

 

#include <fcntl.h>

#include <sys/select.h>

#include <sys/time.h>

#include <sys/types.h>

 

#define FUNC_RUN            0

#define FUNC_NOT_RUN          1

 

#define SIMPLE_TEST              1

#define READ_SIM_CARD_ID 2

#define GSM_GPRS_SIGNAL     3

#define MAKE_A_CALL            4

#define WAIT_A_CALL            5

#define SHORT_MESSAGE              6

#define POWER_MANAGE              7

#define FUNC_QUIT          8

 

#define SEND_SHORT_MESSAGE           1

#define READ_SHORT_MESSAGE           2

#define CONFIG_SHORT_MESSAGE_ENV        3

#define QUIT_SHORT_MESSAGE            4

 

#define DEVICE_TTYS "/dev/ttySAC1"

#define MAX_LEN_OF_SHORT_MESSAGE    140

 

 

#define RECEIVE_BUF_WAIT_1S 1

#define RECEIVE_BUF_WAIT_2S 2

#define RECEIVE_BUF_WAIT_3S 3

#define RECEIVE_BUF_WAIT_4S 4

#define RECEIVE_BUF_WAIT_5S 5

 

#define VERSION         "YHPDA_GSM_1.0.0"

 

void showversion(void)

{

        printf("*********************************************\n");

        printf("\t %s \t\n", VERSION);

        printf("*********************************************\n\n");

 

}

 

//------------------------------------- read datas from GSM/GPRS --------------------------------------------

// succese return 1

// error   return 0

int read_GSM_GPRS_datas(int fd, char *rcv_buf,int rcv_wait)

{

       int retval;

       fd_set rfds;

       struct timeval tv;

 

       int ret,pos;

 

       tv.tv_sec = rcv_wait;      // wait 2.5s

        tv.tv_usec = 0;

 

       pos = 0; // point to rceeive buf

      

       while (1)

       {

              FD_ZERO(&rfds);

                FD_SET(fd, &rfds);

 

              retval = select(fd+1 , &rfds, NULL, NULL, &tv);

 

                if (retval == -1)

              {

                        perror("select()");

                        break;

                }

              else if (retval)

              {// pan duan shi fou hai you shu ju

                        ret = read(fd, rcv_buf+pos, 2048);

                        pos += ret;

                        if (rcv_buf[pos-2] == '\r' && rcv_buf[pos-1] == '\n')

                     {

                                FD_ZERO(&rfds);

                                FD_SET(fd, &rfds);

 

                                retval = select(fd+1 , &rfds, NULL, NULL, &tv);

 

                                if (!retval) break;// no datas, break

                        }

                }

              else

              {

                        printf("No data\n");

                        break;

                }

       }

 

       return 1;

} // end read_GSM_GPRS_datas

 

 

//------------------------------------- send cmd ------------------------------------------------------------

// succese return 1

// error   return 0

int send_GSM_GPRS_cmd(int fd, char *send_buf)

{

       ssize_t ret;

      

       ret = write(fd,send_buf,strlen(send_buf));

       if (ret == -1)

        {

                printf ("write device %s error\n", DEVICE_TTYS);

                return -1;

        }

 

       return 1;

} // end send_GSM_GPRS_cmd

 

//------------------------------------- send cmd and read back result ---------------------------------------

void GSM_GPRS_send_cmd_read_result(int fd, char *send_buf, int rcv_wait)

{

        char rcv_buf[2048];

 

       if((send_buf==NULL) || (send_GSM_GPRS_cmd(fd,send_buf)))

       {     // send success , then read

              bzero(rcv_buf,sizeof(rcv_buf));

              if (read_GSM_GPRS_datas(fd,rcv_buf,rcv_wait))

                {

                        printf ("%s\n",rcv_buf);

                }

                else

                {

                        printf ("read error\n");

                }

 

       }

       else

       {

              printf("write error\n");

       }

} // end GSM_GPRS_send_cmd_read_result

 

//------------------------------------- send cmd : "at" to GSM/GPRS MODEM -----------------------------------

void GSM_simple_test(int fd)

{

       char *send_buf="at\r";

      

       GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);

 

} // end GSM_simple_test

 

//------------------------------------- send cmd : "at+ccid" to GSM/GPRS MODEM ------------------------------

void GSM_read_sim_card_id(int fd)

{

        char *send_buf="at+ccid\r";

 

       GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);

 

} // end GSM_read_sim_card_id

 

//------------------------------------- send cmd : "at+ccid" to GSM/GPRS MODEM ------------------------------

void GSM_gprs_signal(int fd)

{

        char *send_buf="at+creg?\r";

       GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);

        send_buf="at+cgreg?\r";

       GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);

        send_buf="at+csq\r";

       GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);

        send_buf="at+cops?\r";

       GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);

} // end GSM_read_sim_card_id

 

//------------------------------------- send cmd : "atd<tel_num>;" to GSM/GPRS MODEM ------------------------

//------------------------------------- finish call, send cmd:  "ath" to GSM MODEM --------------------------

void GSM_call(int fd)

{

       char send_buf[17];

       char *send_cmd_ath = "ath\r";

       int i;

 

        // input telephone number

        bzero(send_buf,sizeof(send_buf));

      

        send_buf[0]='a';

        send_buf[1]='t';

        send_buf[2]='d';

       send_buf[16] = '\0';

 

        printf("please input telephone number:");

 

        i = 3;

        while (1)

        {

                send_buf[i]=getchar();

                if (send_buf[i]=='\n') break;

                i++;

        }

 

        send_buf[i]=';';

        send_buf[i+1]='\r';

       // end input telphone number

 

       // send cmd

       GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);

 

        //quit call

        printf("press ENTER for quit:");

        getchar();

 

        // send cmd

       GSM_GPRS_send_cmd_read_result(fd,send_cmd_ath,RECEIVE_BUF_WAIT_1S);

      

} // end GSM_call

 

//------------------------------------- wait for GSM/GPRS call signal ---------------------------------------

void GSM_wait_call(int fd)

{

       char rcv_buf[2048];

       char *send_cmd_ath = "ath\r";

        int wait_RING;

 

        wait_RING = 10;

        while (wait_RING!=0)

        {    

              bzero(rcv_buf,sizeof(rcv_buf));

 

              if (read_GSM_GPRS_datas(fd,rcv_buf,RECEIVE_BUF_WAIT_1S))

                {

                        printf ("%s\n",rcv_buf);

                }

                else

                {

                        printf ("read error\n");

                }

              wait_RING--;

        }

      

       GSM_GPRS_send_cmd_read_result(fd,send_cmd_ath,RECEIVE_BUF_WAIT_1S);

 

        printf("quit wait_call\n");

 

} // end GSM_wait_call

 

//------------------------------------- GSM/GPRS Config short message env -----------------------------------

void GSM_Power_Manage(int fd)

{

       char *send_buf="AT+CPOWD\r";// power off

       GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);

} // end GSM_Conf_Message

 

//------------------------------------- GSM/GPRS send short message -----------------------------------------

void GSM_Send_Message(int fd)

{

        char cmd_buf[23];

        char short_message_buf[MAX_LEN_OF_SHORT_MESSAGE];

        int  i;

        char rcv_buf;

 

        bzero(cmd_buf,sizeof(cmd_buf));

        bzero(short_message_buf,sizeof(short_message_buf));

 

        printf ("send short message:\n");

 

        cmd_buf[0]='a';

        cmd_buf[1]='t';

        cmd_buf[2]='+';

        cmd_buf[3]='c';

        cmd_buf[4]='m';

        cmd_buf[5]='g';

        cmd_buf[6]='s';

        cmd_buf[7]='=';

        cmd_buf[8]='"';

 

        printf ("please input telephone number:");

 

        i = 9;

        while (1)

        {

                cmd_buf[i]=getchar();

                if (cmd_buf[i]=='\n') break;

                i++;

        }

       cmd_buf[i]='"';

        cmd_buf[i+1]='\r';

       cmd_buf[i+2]='\0';

 

        // send cmd :  at+cmgs="(telephone number)"

       GSM_GPRS_send_cmd_read_result(fd,cmd_buf,RECEIVE_BUF_WAIT_1S);

      

      // input short message

        printf("please input short message:");

 

        i = 0;

        while(i < MAX_LEN_OF_SHORT_MESSAGE-2)

        {

                short_message_buf[i] = getchar();

                if (short_message_buf[i]=='\n') break;

                i++;

        }

        short_message_buf[i] = 0x1A;

        short_message_buf[i+1] = '\r';

       short_message_buf[i+2] = '\0';

 

        // send short message

       GSM_GPRS_send_cmd_read_result(fd, short_message_buf,RECEIVE_BUF_WAIT_4S);

 

        printf("\nend send short message\n");

} // end GSM_Send_Message

 

//------------------------------------- GSM/GPRS read all short message -------------------------------------

void GSM_Read_Message(int fd)

{

       char *send_buf="at+cmgl=\"ALL\"\r";

       char rcv_buf[2048];

 

        GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_3S);

 

       printf("end read all short message\n");

 

} // end GSM_Read_Message

 

//------------------------------------- GSM/GPRS Config short message env -----------------------------------

void GSM_Conf_Message(int fd)

{

       char *send_buf="at+cmgf=1\r";

       char *send_center_buf="at+csca=\"+8613800571500\"\r";

 

       GSM_GPRS_send_cmd_read_result(fd,send_buf,RECEIVE_BUF_WAIT_1S);

 

        // set short message center number

        GSM_GPRS_send_cmd_read_result(fd,send_center_buf,RECEIVE_BUF_WAIT_1S);

 

        printf("end config short message env\n");

} // end GSM_Conf_Message

 

 

//------------------------------------- GSM/GPRS short message ----------------------------------------------

void GSM_short_mesg(int fd)

{

        int flag_sm_run, flag_sm_select;

 

        flag_sm_run = FUNC_RUN;

        while (flag_sm_run == FUNC_RUN)

        {

                printf ("\n Select:\n");

                printf ("1 : Send short message \n");

                printf ("2 : Read all short message \n");

                printf ("3 : Config short message env\n");

                printf ("4 : quit\n");

                printf (">");

                scanf("%d",&flag_sm_select);

                getchar();

              // temp

       //     printf ("input select:%d\n",flag_sm_select);

              // end temp

                switch (flag_sm_select)

                {

                        case SEND_SHORT_MESSAGE         :       { GSM_Send_Message(fd);         break; }

                        case READ_SHORT_MESSAGE         :       { GSM_Read_Message(fd);         break; }

                        case CONFIG_SHORT_MESSAGE_ENV   :       { GSM_Conf_Message(fd);         break; }

                        case QUIT_SHORT_MESSAGE         :       { flag_sm_run = FUNC_NOT_RUN;       break; }

                        default :

                                {

                                        printf("please input your select use 1 to 3\n");

                                }

                }

        }

        printf ("\n");

 

} // end GSM_send_mesg

 

//------------------------------------- print ---------------------------------------------------------------

void print_prompt(void)

{

        printf ("Select what you want to do:\n");

        printf ("1 : Simple Test\n");

        printf ("2 : Read SIM CARD ID\n");

        printf ("3 : Test GSM/GPRS signal\n");

        printf ("4 : Make A Call\n");

        printf ("5 : Wait A Call\n");

        printf ("6 : Short message\n");

        printf ("7 : Power manage\n");

        printf ("8 : Quit\n");

        printf (">");

} // end print_prompt

 

//------------------------------------- Control GSM/GPRS MODULE ---------------------------------------------

void func_GSM(int fd)

{

        int flag_func_run;

        int flag_select_func;

        ssize_t ret;

 

        flag_func_run = FUNC_RUN;

 

        while (flag_func_run == FUNC_RUN)

        {

                print_prompt();                    // print select functions

                scanf("%d",&flag_select_func);    // user input select

                getchar();

 

                switch(flag_select_func)

                {

                        case SIMPLE_TEST        : {GSM_simple_test(fd);         break;}

                        case READ_SIM_CARD_ID   : {GSM_read_sim_card_id(fd);    break;}

                        case GSM_GPRS_SIGNAL    : {GSM_gprs_signal(fd);         break;}

                        case MAKE_A_CALL        : {GSM_call(fd);                break;}

                        case WAIT_A_CALL        : {GSM_wait_call(fd);           break;}

                        case SHORT_MESSAGE      : {GSM_short_mesg(fd);          break;}

                        case POWER_MANAGE       : {GSM_Power_Manage(fd);          break;}

                        case FUNC_QUIT          :

                                                {

                                                        flag_func_run = FUNC_NOT_RUN;

                                                        printf("Quit GSM/GPRS function.  byebye\n");

                                                        break;

                                                }

                        default :

                        {

                                printf("please input your select use 1 to 7\n");

                        }

                }

 

        }

}// end func_GPRS

 

//------------------------------------- init seriel port  ---------------------------------------------------

void init_ttyS(int fd)

{

       struct termios options;

       bzero(&options, sizeof(options));       // clear options

       cfsetispeed(&options,B115200);            // setup baud rate

       cfsetospeed(&options,B115200);

       options.c_cflag |= (CS8 | CREAD);

       options.c_iflag = IGNPAR;

       tcflush(fd, TCIFLUSH);

       tcsetattr(fd, TCSANOW, &options);

}//end init_ttyS

 

 

//------------------------------------- main ----------------------------------------------------------------

int main(void)

{

        int fd;

 

       showversion();

 

        printf("\nGSM/GPRS TESTS\n\n");

 

        // open seriel port

        fd = open(DEVICE_TTYS, O_RDWR);

 

        if (fd == -1)

        {

                printf("open device %s error\n",DEVICE_TTYS);

        }

        else

        {

              init_ttyS(fd);  // init device

              func_GSM(fd);      // GSM/GPRS functions

               

              // close ttyS0

                if (close(fd)!=0) printf("close device %s error",DEVICE_TTYS);

        }

 

        return 0;

}// end main

该程序目前的问题如下,在接受短信的时候无法显示短信的内容,而只是显示一个“~p”,谁有这个问题的解决方法,欢迎与我探讨。

clip_image001

无觅相关文章插件,快速提升流量