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

    使用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语言中的#号和##号的作用
    stm32 HAL库编程驱动控制文件<stm32f1xx_hal_conf.h>的使能方法
    rt-thread是如何做到通过menuconfig配置将相应文件加入工程和从工程中除去
    rt-thread 学习路线
    stm32使用rt-thread在文件《stm32f1xx_hal.h》中头文件包含顺序引出的错误
    rt-thread之stm32系列BSP制作方法
    使用rt-thread中BSP-stm32 ENV构建工具报错
    rt-thread中动态内存分配之小内存管理模块方法的一点理解
    内存对齐
    rt-thread中线程内置定时器的作用 ---
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2063525.html
Copyright © 2011-2022 走看看