zoukankan      html  css  js  c++  java
  • GPRS模块SIM300的使用

    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

  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/feisky/p/1740956.html
Copyright © 2011-2022 走看看