GPRS模組SIM300的使用

MARS_Turing發表於2017-08-16

使用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, NULLNULL, &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, NULLNULL, &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

相關文章