这几天搞GPRS模块,虽然花费了些时间,但是也收获了很多,从开始连GPRS模块主要干啥都不清楚,一点一点的查找、学习。前面学习了通过串口用AT命令实现了短信的收发和删除。这几天通过学习linux高级编程那本书和学习别人的文章、博客,先是学习linux下串口编程,然后编程实现GPRS模块短信的收发和删除操作,为了调试这几天不知道用我的手机卡发了多少短信,不过总算搞定。
下面是实现代码:
/*********************************************************************************
* Copyright: (C) 2014 liu chengdeng<1037398771@qq.com>
* All rights reserved.
*
* Filename: my_msm_test.c
* Description: This file
*
* Version: 0.0.0(08/31/2014~)
* Author: liuchengdeng <1037398771@qq.com>
* ChangeLog: 1, Release initial version on "08/31/2014 05:07:59 PM"
*
********************************************************************************/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
struct message_info
{
char cnnu[20];
char phnu[20];
char message[128];
};
void serial_init(int fd)
{
struct termios options;
tcgetattr(fd, &options);
options.c_cflag &= ~CSTOPB;
options.c_iflag = IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
tcsetattr(fd,TCSANOW,&options);
}
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR | O_NOCTTY | O_NDELAY );
if (-1 == fd)
{
perror("Can't Open Serial Port !");
return -1;
}
else
return fd;
}
int send(int fd,char *cmgf,char *cmgs,char *message)
{
int nread,nwrite;
char buff[128];
char reply[128];
memset(buff,0,sizeof(buff));
strcpy(buff,"at\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
memset(buff,0,sizeof(buff));
strcpy(buff,"AT+CMGF=");
strcat(buff,cmgf);
strcat(buff,"\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
memset(buff,0,sizeof(buff));
strcpy(buff,"AT+CMGS=");
strcat(buff,"\"");
strcat(buff,cmgs);
strcat(buff,"\"");
strcat(buff,"\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
memset(buff,0,sizeof(buff));
strcpy(buff,message);
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
sleep(1);
sleep(1);
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
}
int send_en_message(int fd,struct message_info info)
{
char cmgf[] = "1";
int conter = 0;
char cmgs[16] = {'\0'};
printf("please input the recever phone number :\n");
scanf("%s",&info.phnu);
while(strlen(info.phnu) != 11)
{
if(conter >= 3)
{
printf("conter out !\n");
return -1;
}
printf("number shuld be 11 bits,enter agin :\n");
scanf("%s",info.phnu);
conter ++;
}
printf("please input you message :\n");
scanf("%s",&info.message);
strcat(info.message,"\x1a");
strcat(cmgs,info.phnu);
send(fd,cmgf,cmgs,info.message);
}
int read_en_message(int fd)
{
int snum;
char num[]="0";
int nread,nwrite;
char buff[512];
char reply[512];
memset(buff,0,sizeof(buff));
strcpy(buff,"at\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
memset(buff,0,sizeof(buff));
strcpy(buff,"AT+CMGF=1");
strcat(buff,"\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
memset(buff,0,sizeof(buff));
strcpy(buff,"AT+CSCS=\"GSM\"");
strcat(buff,"\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
printf("just read unread--message please input 1:\n");
printf("if you read just one message please input 2:\n");
printf("if you read all the message please input 3:\n");
printf("input the number what you want to do :");
scanf("%d",&snum);
while(!((snum==1)||(snum==2)||(snum==3)))
{
printf("input error ,please again:");
scanf("%d",&snum);
}
if(snum==1)
{
memset(buff,0,sizeof(buff));
strcpy(buff,"AT+CMGL=\"UNREAD\"");
strcat(buff,"\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
}
else if(snum==2)
{
printf("please input the number you want to read:");
scanf("%s",&num);
memset(buff,0,sizeof(buff));
strcpy(buff,"AT+CMGR=");
strcat(buff,num);
strcat(buff,"\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
}
else
{
memset(buff,0,sizeof(buff));
strcpy(buff,"AT+CMGL=\"ALL\"");
strcat(buff,"\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
sleep(1);
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
}
return 0;
}
int delete_en_message(int fd)
{
int nread,nwrite;
char num[]="0";
char buff[128];
char reply[128];
memset(buff,0,sizeof(buff));
strcpy(buff,"at\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
printf("please input the number you want to delete:");
scanf("%s",&num);
memset(buff,0,sizeof(buff));
strcpy(buff,"AT+CMGD=");
strcat(buff,num);
strcat(buff,"\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
}
int main(int argc, char **argv)
{
int fd,select;
int nread,nwrite;
struct message_info info;
char buff[256];
char reply[256];
char *dev = "/dev/ttyS1"; //鎴戠殑鏄覆鍙d簩
fd = OpenDev(dev);
serial_init(fd);
printf("this just be used to send English message\n");
printf("0.exit.\n");
printf("1.send message.\n");
printf("2.read message.\n");
printf("3.delete message.\n");
printf("enter your selete :\n");
select = getchar();
switch(select)
{
case '1': send_en_message(fd,info);
break;
case '2': read_en_message(fd);
break;
case '3': delete_en_message(fd);
break;
case '0': break;
default : break;
}
close(fd);
return 0;
}
以下是部分测试过程:
[root@root /]# ./my_msm_test
this just be used to send English message
0.exit.
1.send message.
2.read message.
3.delete message.
enter your selete :
2
nwrite=3,at
nread=9,at
OK
nwrite=10,AT+CMGF=1
nread=16,AT+CMGF=1
OK
nwrite=14,AT+CSCS="GSM"
nread=20,AT+CSCS="GSM"
OK
just read unread--message please input 1:
if you read just one message please input 2:
if you read all the message please input 3:
input what you want to do :
3
nwrite=14,AT+CMGL="ALL"
nread=512,AT+CMGL="ALL"
+CMGL: 1,"REC READ","+8613260579256","","14/09/01,10:26:39+32"
xxxxx
+CMGL: 2,"REC READ","+8613260579256","","14/09/01,16:04:51+32"
hello world
+CMGL: 3,"REC READ","+8613260579256","","14/09/01,16:07:58+32"
+CMGL: 4,"REC READ","+8613260579256","","14/09/01,16:08:26+32"
+CMGL: 5,"REC READ","+8613260579256","","14/09/01,16:10:49+32"
+CMGL: 6,"REC READ","+8613260579256","","14/09/01,13:32:12+32"
ni hao
+CMGL: 7,"REC READ","+8613260579256","","14/09/01,13:33:08+32"
AT+CMGL="ALL"
[root@root /]# ./my_msm_test
this just be used to send English message
0.exit.
1.send message.
2.read message.
3.delete message.
enter your selete :
2
nwrite=3,at
nread=9,at
OK
nwrite=10,AT+CMGF=1
nread=16,AT+CMGF=1
OK
nwrite=14,AT+CSCS="GSM"
nread=20,AT+CSCS="GSM"
OK
just read unread--message please input 1:
if you read just one message please input 2:
if you read all the message please input 3:
input what you want to do :
2
please input the number you want to read:6
nwrite=10,AT+CMGR=6
nread=88,AT+CMGR=6
+CMGR: "REC READ","+8613260579256","","14/09/01,13:32:12+32"
ni hao
OK
[root@root /]# ./my_msm_test
this just be used to send English message
0.exit.
1.send message.
2.read message.
3.delete message.
enter your selete :
3
nwrite=3,at
nread=9,at
OK
please input the number you want to delete:8
nwrite=10,AT+CMGD=8
nread=16,AT+CMGD=8
OK