• 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

  • 相关阅读:
    c++经典书籍介绍
    jpeg软解码实现介绍
    视频编解码类型调查——抖音客户端
    微机接口复习
    更改MySQL数据库的密码
    python学习之创建我的第一个Django项目
    关于 V831 linux 调用 gpio 的一些通用操作。
    SpringBoot整合H2内存数据库快速启动测试
    MybatisPlus的各种功能使用笔记综合!
    MybatisPlus的自动填充功能使用!
  • 原文地址:https://www.cnblogs.com/feisky/p/1740956.html
Copyright © 2020-2023  润新知